想象一下如下代码模式:
var a chan T = make(chan T)
var b chan Q = make(chan Q)
//consumer goroutine
for {
select {
case <-a:
//...
case <-b:
//...
}
}
//producer goroutine
...
a <- x
b <- y
...
是否可以保证总是从案例中检索x:<-a在案例y之前:<-b,前提是只有一个生产者?
答案 0 :(得分:3)
是的,您可以依赖顺序,因为通道a
没有缓冲。
仅当发送方和接收方准备就绪时,无缓冲通道上的通信才能成功。在接收到值之前,发送者不会执行超过语句a <- x
的操作。由此可见,这些值是按发送顺序接收的。
如果缓冲了通道a
,则不能保证顺序。在两个值都发送之前,接收器可能不会执行。当接收器在发送值后确实执行时,不能保证选择的哪个分支将首先执行。