2 回答
TA贡献1775条经验 获得超8个赞
您应该在命名数据通道和信令通道时保持一致。
就这样。
这里有两个生产者 go 例程和一个消费者 go 例程,
所以让我先简化您的代码,在线尝试:
func main() {
ch := make(chan string)
done := make(chan struct{})
go func() {
for _, word := range []string{"1", "2", "3"} {
ch <- word
}
done <- struct{}{}
}()
go func() {
for _, word := range []string{"10", "20", "30", "40"} {
ch <- word
}
done <- struct{}{}
}()
go func() {
<-done
<-done
close(ch)
}()
for word := range ch {
fmt.Print(word, " ")
}
fmt.Println()
}
输出:
1 2 10 3 20 30 40
笔记:
您不需要
sync.WaitGroup
,因为 done 通道足以发送信号。空结构足以发出信号。
收到两个 done 信号后,您可以关闭数据通道,因此 main 退出循环。
TA贡献1795条经验 获得超7个赞
启动三个 goroutine 后,您从通道读取ch
直到ch
关闭。所有函数都ch
作为它们写入的第一个参数,但f1
写入它的第二个参数,而不是第一个参数。也就是说,f1
正在写入c
main 中的通道,因此f1
在第一次写入时被阻止,因为没有人在读取c
. 主 goroutine 被阻止读取,ch
因为在完成之后f
,g
没有人写入它。
这看起来像是通道命名混乱:两个函数 get (c, ch)
,一个 gets (ch, c)
,但都用 调用(ch, c)
。
- 2 回答
- 0 关注
- 107 浏览
添加回答
举报