我对golang的开发很新,所以如果这是一个基本问题我道歉 . 我没有看到已经提出的类似问题;如果有,请指出我(谢谢) .
完整的代码(在我提出这个问题的时候,因为它不是一成不变的)是http://play.golang.org/p/idDp1E-vZo
我've declared a struct with four primitive fields, and I'm从本地文件系统上的文件中读取发往 Node.ipaddr
的值(我在运行时将 fileName
的值作为标志;这里的代码被修剪掉,但在上面提供的链接中 . )
type Node struct {
hostname string
ipaddr string
pstatus string
ppid int
}
file, err := os.Open(fileName)
if err != nil {
panic(fmt.Sprintf("error opening %s: %v", fileName, err))
}
因为文件是行分隔的,所以我认为 bufio.Scanner
非常适合从文件中读取数据 . 我正在努力寻找一种优雅的方式将数据实际传递给struct元素 .
我创建了一个 Node
元素的数组,并考虑了 map
,但我不确定如何实际使用它(还) .
var nodes []*Node
var nodemap = make(map[string]*Node) //do I even need this?
scanner := bufio.NewScanner(file)
for scanner.Scan() {
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "error reading from file:", err)
os.Exit(3)
}
//pass scanner.Text() into Node.ipaddr
}
如果没有在索引的 for
循环中包装 scanner.Scan()
,我完全不确定如何继续 . 如果我在索引的 for
循环中包装 scanner.Scan()
,那么 for
循环是否能够优雅地处理EOF - 我想我不确定在这种情况下索引限制/最大比较值应该是多少 .
一如既往,感谢您愿意提供的任何建议 .
edit :输入文件的格式如下:
10.1.1.1
10.1.1.2
10.1.1.3
我预计文件中大约有150个条目,每行一个IPv4地址 .
2 回答
您唯一缺少的是
append
函数,用于向切片添加新节点 .此外,您可以在
for
循环上拥有索引,同时仍然使用scanner.Scan()
作为条件 . 这样可以优雅地处理EOF
,同时仍然允许您在需要时访问新的Node
.完整代码:http://play.golang.org/p/RvMQp-jgWF
您可以使用this的内容: