我对golang的开发很新,所以如果这是一个基本问题,我道歉。我没有看到已经提出的类似问题;如果有,请指出我(谢谢)。
完整的代码(在我提出这个问题的时候,因为它不是一成不变的)是http://play.golang.org/p/idDp1E-vZo
我已经声明了一个包含四个原始字段的结构,并且我正在从本地文件系统上的文件中读取发往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
}
如果没有将scanner.Scan()
包装在索引for
循环中,我完全不确定如何继续。如果我将scanner.Scan()
包裹在索引for
循环中,for
循环是否能够优雅地处理EOF - 我想我不确定索引限制/最大比较值是什么应该是那种情况。
一如既往,感谢您愿意提供的任何建议。
编辑:输入文件的格式如下:
10.1.1.1
10.1.1.2
10.1.1.3
我预计文件中大约有150个条目,每行一个IPv4地址。
答案 0 :(得分:2)
你可以使用this
:
func main() {
file := strings.NewReader(IPS) //os.Open(fileName)
var nodes []*Node
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)
}
ip := net.ParseIP(scanner.Text())
if ip != nil {
nodes = append(nodes, &Node{ipaddr: net.ParseIP(scanner.Text())})
}
}
for _, n := range nodes {
fmt.Printf("%s, %+v\n", n.ipaddr, n)
}
}
答案 1 :(得分:2)
您唯一缺少的是append
函数,用于向切片添加新节点。
nodes = append(nodes, &Node{ipaddr: scanner.Text()})
此外,您可以在for
循环中设置索引,同时仍以scanner.Scan()
作为条件。这样,EOF
可以优雅地处理,同时仍允许您在需要时访问新的Node
。
for i := 0; scanner.Scan(); i++ {
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "error reading from file:", err)
os.Exit(3)
}
nodes = append(nodes, &Node{ipaddr: scanner.Text()})
fmt.Println(nodes[i])
}