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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang中的Reader如何自动迭代循环?相关的知识,希望对你有一定的参考价值。

我正在阅读如何在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。读者如何知道它的哪个迭代?我怎么能改变这个?例如。抓住第一线。

答案

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
}

以上是关于Golang中的Reader如何自动迭代循环?的主要内容,如果未能解决你的问题,请参考以下文章

golang中的io.Reader/Writer

Python:为啥这个 for 循环在第一次迭代后退出?

golang strings.NewReader

golang中的那些坑之迭代器中的指针使用

如何计算 Chapel forall 循环中的迭代次数

GoLang 之旅