在通道上迭代时写入时 Go 文件 IO 失败
Go file IO fails when writing while iterating over a 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)
}
有一个通过通道传递值的例程,我正在迭代这些值并将它们写入 CSV 文件。我没有收到任何错误,最后它记录了已写入 100 行。
当我检查 CSV 文件时,虽然它是空的。我在应用程序中看到的行为是文件写入不完整;它会在写入记录的中途停止。我确定我遗漏了什么,但如果写入 returns 没有错误,为什么文件中没有任何内容?
您的函数末尾缺少 writer.Flush()
。
更多信息here
我在遍历通道时将行写入 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 文件时,虽然它是空的。我在应用程序中看到的行为是文件写入不完整;它会在写入记录的中途停止。我确定我遗漏了什么,但如果写入 returns 没有错误,为什么文件中没有任何内容?
您的函数末尾缺少 writer.Flush()
。
更多信息here