golang从文件填充结构字段

Pat*_*ick 5 go

我对 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))
}
Run Code Online (Sandbox Code Playgroud)

因为文件是行分隔的,所以我认为 abufio.Scanner是从文件中读取数据的理想选择。我正在努力寻找一种优雅的方法来将数据实际传递到结构元素中。

我创建了一个元素数组Node,并考虑了 a 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

}
Run Code Online (Sandbox Code Playgroud)

由于没有包裹scanner.Scan()在索引for循环中,我根本不知道如何继续。如果我确实包装scanner.Scan()在索引for循环中,该for循环是否能够优雅地处理 EOF ——我想我不确定在这种情况下索引限制/最大比较值应该是多少。

一如既往,感谢您愿意提供的任何建议。

编辑:输入文件的格式如下:

10.1.1.1
10.1.1.2
10.1.1.3
Run Code Online (Sandbox Code Playgroud)

我预计文件中大约有 150 个条目,每行一个 IPv4 地址。

Gre*_*reg 2

您唯一缺少的是append向切片添加新节点的功能。

nodes = append(nodes, &Node{ipaddr: scanner.Text()})
Run Code Online (Sandbox Code Playgroud)

另外,您可以在循环上有一个索引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])
}
Run Code Online (Sandbox Code Playgroud)

完整代码: http: //play.golang.org/p/RvMQp-jgWF