我正试图弄清楚如何(或者是否可能)在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。档案
答案 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]
$