无缓冲通道会阻塞接收器,直到通道上有可用数据为止。对我来说,目前还不清楚这种阻塞如何在同一通道上的多个接收器下发生(例如,使用goroutines时)。我确信只要该通道上没有数据发送,它们都会阻塞。 但是,一旦我向该通道发送单个值,会发生什么?哪个接收者/ goroutine将获取数据并因此解除阻止?他们全部?排在第一位?随机?
单个随机(不确定)的将接收它。
请参阅语言规范:
“ select”语句的执行分几个步骤进行: 对于语句中的所有情况,输入“ select”语句后,将按源顺序对接收操作的通道操作数以及send语句的通道和右侧表达式进行一次精确评估。结果是一组要从中接收或发送到的通道,以及要发送的相应值。无论选择进行哪个通信操作,都会发生该评估中的任何副作用。带有简短变量声明或赋值的RecvStmt左侧的表达式尚未评估。 如果可以进行一种或多种通信,则可以通过统一的伪随机选择来选择可以进行的单个通信。 否则,如果存在默认情况,则选择该情况。如果没有默认情况,则“ select”语句将阻塞,直到可以进行至少一种通信为止。 除非所选情况是默认情况,否则将执行相应的通信操作。 如果所选案例是带有简短变量声明或赋值的RecvStmt,则将评估左侧表达式并分配接收的值(或多个值)。 执行所选案例的语句列表。
“ select”语句的执行分几个步骤进行: