在迭代通道

时间:2015-12-03 04:16:00

标签: go io channel goroutine

我在迭代频道时将行写入csv文件时遇到问题。我是Go的新手,但文件IO的语法看起来与我同步。鉴于我希望成功返回的写操作表明写操作已完成,但这不是我观察到的。这基本上就是我在我的应用程序中所做的事情:

package main

import (
    "encoding/csv"
    "log"
    "os"
)

func main() {
    file, err := os.Create("test.csv")
    if err != nil {
        log.Fatalf("Error opening file: %s", err.Error())
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    channel := make(chan []string)
    counter := 0

    go func() {
        defer close(channel)

        for i := 0; i < 100; i++ {
            channel <- []string{"col1", "col2"}
        }
    }()

    for vals := range channel {
        if err := writer.Write(vals); err != nil {
            log.Fatalf("Error writing to csv: %s", err.Error())
        }
        counter++
    }

    log.Printf("%d lines written", counter)
}

通过频道传递值的常规例程,我迭代这些值并将它们写入CSV文件。我没有错误,最后它记录了100行已被写入。

当我检查CSV文件时它是空的。我在我的应用程序中看到的行为是文件写得不完整;它会写一个记录中途停止。我确定我遗漏了一些东西,但如果写入没有错误,为什么文件中没有任何内容?

1 个答案:

答案 0 :(得分:3)

您在功能结束时缺少writer.Flush()

更多信息here