【发布时间】:2018-04-08 21:11:53
【问题描述】:
我在这里查看了一些关于 SO 的示例和问题,但仍然无法让一个相当简单的代码按预期工作:
func main() {
ch := make(chan string)
var wg sync.WaitGroup
wg.Add(2)
go readFile("A", ch, wg)
go readFile("B", ch, wg)
go func() {
wg.Wait()
close(ch)
}()
printer(ch)
}
func readFile(name string, ch chan string, wg sync.WaitGroup) {
file, err := os.Open(name)
if err != nil {
fmt.Errorf("was not able to read from file %s: %s", name, err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
ch <- scanner.Text()
}
wg.Done()
}
func printer(ch chan string) {
for val := range ch {
fmt.Println(val)
}
}
所以我从两个文件中读取,将读取的行推送到一个通道中,然后简单地打印出来(一些代码是从不需要的细节中简化的)
两个 goroutine,两个都是 WaitGroup,用 Wait 修复 goroutine 并关闭通道。
从我的角度来看,这与这个问题和 exepted 答案几乎相同:Let golang close used channel after all goroutines finished
那么我的情况有什么问题?
【问题讨论】:
-
尝试将 WaitGroup 指针传递给
readFile而不是值。 -
"第一次使用后不得复制 WaitGroup。"请改用指向 WaitGroup 的指针。
-
运行
go vet,或者进行单个单元测试都会立即显示错误。 -
获取或不获取它们不是问题。问题是我没有看到我正在传递一个值而不是一个指针。
-
是的,
go vet警告您正在复制该值,go test运行go vet。