想象一个如下所示的代码模式:
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 之前从 case:<-b 中检索 x?
最佳答案
是的,您可以依赖订单,因为 channel a
是无缓冲的。
只有当发送方和接收方准备就绪时,无缓冲 channel 上的通信才会成功。发送方不执行语句 a <- x
直到收到值。由此可见,这些值是按发送顺序接收的。
如果 channel a
则订单无法保证被缓冲。在发送两个值之前,接收器可能不会执行。当接收器在发送值后确实执行时,无法保证选择的哪个分支将首先执行。
关于go - 我可以依赖基于发送顺序的选择唤醒顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53510858/