【发布时间】:2012-03-25 17:41:54
【问题描述】:
我需要将一个整数文件读入一个数组。我有它的工作:
package main
import (
"fmt"
"io"
"os"
)
func readFile(filePath string) (numbers []int) {
fd, err := os.Open(filePath)
if err != nil {
panic(fmt.Sprintf("open %s: %v", filePath, err))
}
var line int
for {
_, err := fmt.Fscanf(fd, "%d\n", &line)
if err != nil {
fmt.Println(err)
if err == io.EOF {
return
}
panic(fmt.Sprintf("Scan Failed %s: %v", filePath, err))
}
numbers = append(numbers, line)
}
return
}
func main() {
numbers := readFile("numbers.txt")
fmt.Println(len(numbers))
}
文件 numbers.txt 只是:
1
2
3
...
ReadFile() 似乎太长(可能是因为处理错误)。
是否有更短/更符合 Go 语言习惯的方式来加载文件?
【问题讨论】:
-
你错过了
fd.Close()。添加defer fd.Close()作为readFile的第二行。 -
在错误检查之后放置'defer fd.Close()'。当文件读取失败时,您将从该行得到运行时恐慌,因为 fd 为 nil。首先检查错误,然后推迟关闭。如果您打开失败,您无论如何都不需要关闭。
-
澄清一下,这是因为延迟会立即评估并稍后执行。因此,当您尝试在 nil fd(没有方法)上延迟 fd.Close() 时,您会感到恐慌。 'x := 2;推迟 fmt.Print(x); x = 3' 将打印 '2',而不是 3。
标签: go