Golang中的Reader如何自动迭代循环?

时间:2017-12-24 20:59:30

标签: go

我正在阅读如何在Golang中使用CSV并遇到此代码:

csvFile, _ := os.Open("people.csv")
reader := csv.NewReader(bufio.NewReader(csvFile))
var people []Person
for {
    line, error := reader.Read()
    if error == io.EOF {
        break
    } else if error != nil {
        log.Fatal(error)
    }
    people = append(people, Person{
        Firstname: line[0],
        Lastname:  line[1],
    })
}

位于:https://www.thepolyglotdeveloper.com/2017/03/parse-csv-data-go-programming-language/

我觉得这里令人困惑的是无限的for循环,每次迭代抓住下一行但是没有lineNum++类型的逻辑被传递到Reader中。读者如何知道它的哪个迭代?我怎么能改变这个?例如。抓住只是第一行。

1 个答案:

答案 0 :(得分:8)

  

Golang中的Reader如何自动迭代循环?   读者如何知道它在哪个迭代?

Read方法通过从底层io.Reader中消耗更多数据来返回下一条记录。当基础读取器中没有更多记录时,Read方法返回io.EOF。

应用程序负责在循环中调用read,如示例所示。

Reader不需要知道读取下一条记录的行号,但Reader确实在其内部状态中保留line counter以注释错误。

如果应用程序需要知道行号,应用程序可以声明一个计数器并在每次读取时递增计数器。

  

我该怎么改变?例如。抓住第一行。

调用一次读取:

f, err := os.Open("people.csv")
if err != nil {
    // handle error
} 
defer f.Close()

r := csv.NewReader(f)
firstLine, err := r.Read()
if err != nil {
   // handle error
}