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

时间:2015-11-30 18:36:52

标签: go

我正试图弄清楚如何(或者是否可能)在Golang中组合多个赋值和范围

我想做的伪代码

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

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

我想要同时拥有一个迭代计数器(i)和文件名(fileName)。我知道这可以通过使用范围和一些数学(key -1)中的键来实现,这不是示例的要点。

修改:

在调试上面的例子后,我了解到i在这个例子中的范围是0-1;因为os.Args [1:2]是一个切片,并且该切片的索引为0-1。因此,我不需要“一些数学”来正确索引键。

**编辑2:** This post is also a must read关于为什么上述[2]*os.File{}不是惯用的,相反,它不应该指定一个大小(files := []*os.File{}),以便files的类型为* os。档案

2 个答案:

答案 0 :(得分:5)

这里有很多不同的问题。首先,range已经做了你想要的。甚至不需要数学。

for i, fileName := range os.Args[1:] {
就像你想要的那样,

i的范围从0到1。在切片上的范围始终从索引0开始(它相对于切片的开始)。 (http://play.golang.org/p/qlVM6Y7yPD

请注意os.Args[1:2]只是一个元素。你可能认为它是两个。

无论如何,这可能就是你的真正含义:

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\n", files)

固定长度数组在Go中非常罕见。通常,您需要使用make创建的切片。

答案 1 :(得分:3)

例如,

so.go

package main

import (
    "fmt"
    "os"
)

func main() {
    files := [2]*os.File{}
    for i, fileName := range os.Args[1:] {
        if i >= len(files) {
            break
        }
        var err error
        files[i], err = os.Open(fileName)
        if err != nil {
            // handle error
        }
    }
    fmt.Println(files)
}

输出:

$ go build so.go && ./so no.go so.go to.go
[<nil> 0xc820030020]
$