【发布时间】:2021-11-26 03:58:57
【问题描述】:
给定以下代码:
ch1 := make(chan struct{}, 1)
ch2 := make(chan struct{})
ready := make(chan struct{})
done := make(chan struct{})
go func() {
close(ready)
select {
case <-ch1:
fmt.Println("ch1")
case <-ch2:
fmr.Println("ch2")
}
}()
<-ready
ch1 <- struct{}{}
close(ch2)
<-done
是否保证总是打印“ch1”?或者有没有可能因为 ch1 被缓冲并且 ch2 被关闭之后,第二个 case 可以先运行?
在文档/代码中是否有任何参考来验证此行为?
【问题讨论】:
-
相关参考用于选择语句:golang.org/ref/spec#Select_statements,其中 ” 如果一个或多个通信可以继续,则通过统一的伪随机选择选择一个可以继续的通信。”。频道是按顺序“写入”的,但您关心的是先接收哪个频道。
标签: go concurrency