golang从文件填充struct字段

时间:2014-05-14 22:14:45

标签: 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))
}

因为文件是行分隔的,所以我认为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地址。

2 个答案:

答案 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])
}

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