我可以依赖 select 基于发送顺序的唤醒顺序吗?

Can I rely on the order of select wake ups based on sending order?

想象如下代码模式:

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
...

如果只有一个生产者,是否保证我们始终可以从 case:<-a 中检索 x,然后从 case:<-b 中检索 y?

是的,您可以依赖订单,因为通道 a 是无缓冲的。

只有当发送方和接收方准备就绪时,无缓冲通道上的通信才会成功。在收到值之前,发送方不会执行语句 a <- x。由此可见,这些值是按发送顺序接收的。

如果通道 a 被缓冲,则无法保证顺序。在发送两个值之前,接收器可能不会执行。当接收方在发送值后确实执行时,无法保证 select 的哪个分支将首先执行。