在 channel 上迭代时写入时 Go 文件 IO 失败

标签 go io channel goroutine

我在遍历 channel 时遇到向 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)
}

有一个通过 channel 传递值的例程,我正在迭代这些值并将它们写入 CSV 文件。我没有收到任何错误,最后它记录了已写入 100 行。

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

最佳答案

您在函数末尾缺少 writer.Flush()

更多信息 here

关于在 channel 上迭代时写入时 Go 文件 IO 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057795/

相关文章:

go - 在 go lang 中,为什么这是 7 ?断言(5^2 == 7)

go - 如何使用 "or"进行变量赋值

c++ - 是否可以在循环中写入多个二进制文件

multithreading - 我怎样才能拥有一个等待来自多个其他人的值的 goroutine 函数?

go - 利用goroutines和channel进行从上到下的树构建功能

go - 在 golang 中发布数据后将用户重定向回相同的 URL

go - 判断一个词是否是另一个的复数形式

c - fopen中的r+和a+有什么区别?

java - 从 Java 文件中读取特定行

clojure - 如何使用 core.async 实现天网 1m 微基准测试?