【发布时间】:2020-06-02 22:09:31
【问题描述】:
我正在使用 go 通道执行我的第一步,并尝试编写以下代码,我想在其中使用从给定 csv 文件读取的 goroutine 执行以下操作,将读取记录发送到正在添加的另一个通道相同的记录到另一个 csv 文件:
package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"log"
"os"
)
func failOnError(err error) {
if err != nil {
log.Fatal("Error:", err)
panic(err)
}
}
func main() {
read := make(chan Data)
go func(input_file string) {
var data Data
fr, err := os.Open(input_file)
failOnError(err)
defer fr.Close()
r := csv.NewReader(fr)
rows, err := r.ReadAll()
failOnError(err)
data.header = rows[0]
for _, row := range rows[1:] {
data.lines = append(data.lines, Person{
Firstname: row[0],
Lastname: row[1],
Address: &Address{
City: row[2],
State: row[3],
},
})
}
peopleJson, _ := json.Marshal(data.lines)
fmt.Println(string(peopleJson)) // This is working smoothly
read <- data
}("people.csv")
csvOut, err := os.Create("resultsfile.csv")
if err != nil {
log.Fatal("Unable to open output")
}
out := make(chan int)
select {
case data := <-read:
go func(data Data) {
println("data received") // <-- Not show up
w := csv.NewWriter(csvOut)
defer csvOut.Close()
// handle header
data.header = append(data.header, "score")
if err = w.Write(data.header); err != nil {
log.Fatal(err)
}
/*
hanlde data
*/
w.Flush()
out <- 0
}(data)
case _ = <-out:
println("done")
}
}
type Person struct {
Firstname string `json:"firstname"` // JSON annotation will allow for easy printing to JSON after it had been loaded
Lastname string `json:"lastname"`
Address *Address `json:"address,omitempty"`
}
type Address struct {
City string `json:"city"`
State string `json:"state"`
}
type Data struct {
header []string
lines []Person
}
我的代码失败,没有错误并且没有显示data received 注释
people.csv 文件是:
First,Last,City,State
Nic,Raboy,San Francisco,CA
Maria,Raboy,Dublin,CA
Hasan,yousef, Jordan, ZA
我得到的输出是:
[Running] go run "d:\goplay\csv.go"
[{"firstname":"Nic","lastname":"Raboy","address":{"city":"San Francisco","state":"CA"}},{"firstname":"Maria","lastname":"Raboy","address":{"city":"Dublin","state":"CA"}},{"firstname":"Hasan","lastname":"yousef","address":{"city":" Jordan","state":" ZA"}}]
[Done] exited with code=0 in 1.233 seconds
【问题讨论】:
-
@DanielFarrell 问题已更新为 csv 文件和终端输出
-
您可以尝试像以前那样使用频道。您也可以使用等待组。 play.golang.org/p/GlbdKVyENJF
-
非常感谢@mh-cbon 我从这两个代码中学到了很多,感谢
-
@mh-cbon 我正在用 Go 迈出第一步,这个星期天才开始 :) 嗯,你告诉我,再有机会学习会发生什么 :)
标签: go