dtbonklcs575884485 2015-11-30 10:36
浏览 222
已采纳

如何在for循环中组合多个赋值和Range

I'm trying to figure out how to (or if it's possible to) combine multiple assignment and ranges in Golang

ex pseudo code of what I'd like to do

files := [2]*os.File{}

for i, _, fileName := 0, range os.Args[1:3] {
  files[i], _ = os.Open(fileName)
}

The idea being I want to have both an iteration counter (i) and the filenames (fileName). I know this can be achieved by using the key from range and some math (key -1), thats not the point of the example.

Edit:

Upon debugging the above example, I learned that i will range 0-1 in that example; Because os.Args[1:2] is a slice and that slice has indexing 0-1 . Therefore I dont need "some math" to properly index the keys.

** EDIT 2: ** This post is also a must read as to why the above [2]*os.File{} is not idiomatic go, instead it should not have a size specified (files := []*os.File{}) so that files is of type slice of *os.File

  • 写回答

2条回答 默认 最新

  • dongyixiu3110 2015-11-30 11:32
    关注

    There are a lot of different issues here. First, range already does what you want. There's no need for even math.

    for i, fileName := range os.Args[1:] {
    

    i will range from 0 to 1 here, just like you want. Ranging over a slice always starts at index 0 (it's relative to the start of the slice). (http://play.golang.org/p/qlVM6Y7yPD)

    Note that os.Args[1:2] is just one element. You probably meant it to be two.

    In any case, this is likely what you really meant:

    http://play.golang.org/p/G4yfkKrEe7

    files := make([]*os.File, 0)
    
    for _, fileName := range os.Args[1:] {
        f, err := os.Open(fileName)
        if err != nil {
            log.Fatalf("Could not open file: %v", err)
        }
        files = append(files, f)
    }
    fmt.Printf("%v
    ", files)
    

    Fixed-length arrays are very uncommon in Go. Generally you want a slice, created with make.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部