【发布时间】:2021-06-24 03:46:57
【问题描述】:
我是 Go 新手,我也很难阅读文档。任何人都可以帮助解释下面的代码有什么问题
package main
import (
"fmt"
)
func main() {
c := make(chan int)
for i := 0; i < 10; i++ {
go func() {
add(c)
}()
}
close(c)
for v := range c {
fmt.Println(v)
}
}
func add(c chan<- int) {
c<-123
}
【问题讨论】:
-
它会因为
write on closed channel错误而恐慌。 -
您无法在关闭的频道上发送。您关闭通道并在通道上发送不同步。您应该只在所有发送完成后关闭通道。为此,请使用
sync.WaitGroup。 -
我修改了你的代码以人为地演示恐慌play.golang.org/p/v7bF-01t6sf它没有出现在你的原始代码中,因为main会在123添加到c之前退出。
-
@GeneKoh 显然,因为您只想在所有发送完成后从通道接收,但是在有人在无缓冲通道上从它接收之前,发送无法继续。使用并发消费者,例如:play.golang.org/p/BMtXkmtQxlx
标签: go