2014-05-14 53 views
4

我對於在golang中開發很新,所以如果這是一個基本問題,我很抱歉。我沒有看到已經提出的可比較的問題;如果有的話,請點我(謝謝)。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將是理想的從fil讀取數據即我在掙扎的地方是找到一種將數據真正傳遞給結構元素的優雅方法。

我創建了一個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 - 我想我不確定在這種情況下索引限制/最大比較值應該是多少。

一如既往,感謝您願意提供的任何建議。

編輯:輸入文件的格式是這樣的:

10.1.1.1 
10.1.1.2 
10.1.1.3 

我預計大約在文件中的條目150,每行一個IPv4地址。

+1

你有過的文件的格式控制?如果沒有,也會顯示文件的例子。 – OneOfOne

+0

是的,我可以控制格式。將編輯OP來放置當前的格式,但它們是IPv4地址,每行一個。 – Patrick

+0

考慮到目前的情況,最簡單的事情就是像你一樣掃描每行,並使用以下網址解析ip:http://golang.org/pkg/net/#ParseIP,然後你可以簡單地分配根據需要爲您的節點值解析值。 –

回答

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) 
    } 
} 
+2

我認爲這是一個很好的解決方案,前提是文件內容始終是IP地址。我選擇了其他答案,因爲我認爲它會提供更通用的模式,但我也將利用從該解決方案中學到的東西。爲上下文而投票;謝謝。 – Patrick

+0

在Go中編程的小技巧,總是試圖針對您的數據,它會讓您的代碼更好,更快,更難以破解。 – OneOfOne