1 回答

TA贡献1776条经验 获得超12个赞
当你有这个:
ch := make(chan int, 10)
// ...
select {
case ch <- <-out:
fmt.Println("C")
default:
fmt.Println("D")
}
第一个的通信操作case
是ch <- something
,哪里something
是<-out
。但是something
首先评估,然后才检查案例的哪些通信操作可以进行。
所以<-out
只要它需要就会阻塞,然后ch <- something
检查它是否可以继续。由于您使用了足够大的缓冲区,因此它始终可以在您的示例中继续进行,因此default
永远不会选择。
“select”语句的执行分几个步骤进行:
对于语句中的所有情况,在输入“select”语句时,接收操作的通道操作数以及发送语句的通道和右侧表达式仅按源顺序计算一次。结果是一组要接收或发送到的通道,以及要发送的相应值。无论选择哪种(如果有的话)通信操作进行,该评估中的任何副作用都会发生。RecvStmt 左侧的带有短变量声明或赋值的表达式尚未计算。
如果一个或多个通信可以进行,则通过统一的伪随机选择选择一个可以进行的通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,“select”语句会阻塞,直到至少有一个通信可以继续。
除非所选案例是默认案例,否则执行相应的通信操作。
如果所选案例是带有短变量声明或赋值的 RecvStmt,则计算左侧表达式并分配接收到的值(或多个值)。
执行所选案例的语句列表。
如果你降低 的缓冲区ch
,你会看到偶尔在输出中打印 s(在Go PlaygroundD
上试试)。
ch := make(chan int, 2)
- 1 回答
- 0 关注
- 150 浏览
添加回答
举报