运行以下代码:
func l(ch chan int) {
println("l being")
ch<-1
println("l after write")
time.Sleep(time.Second*1)
println("l goroutine down")
}
func main() {
c := make(chan int)
go l(c)
println("main")
time.Sleep(time.Second*9)
println("main down")
}
您将获得以下结果
main
l being
main down
这意味着向chan发送数据会阻止当前的例程,我对这种行为感到惊讶。我知道来自chan的读取数据将阻止常规,并且很容易理解。但是发送数据到chan块是常规的,我认为它不够好,任何人都可以告诉我为什么Go-Lang有这个设计来帮助我理解?非常感谢你:))
答案 0 :(得分:2)
您没有显示频道的创建,所以我假设它没有缓冲。无缓冲的通道无法保留任何项目,因此发送方将阻塞,直到收到该项目。如果创建缓冲区大小为 n 的缓冲通道,则发送操作不会阻止,除非通道中尚未收到 n 项。要创建缓冲通道,请将缓冲区大小传递给make
,如下所示:
c := make(chan int, 10)
有关详细信息,请参阅https://golang.org/doc/effective_go.html#channels。