首页 文章

golang从文件填充struct字段

提问于
浏览
4

我对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 回答

  • 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

  • 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)
        }
    }
    

相关问题