在同一个选择案例中接收和发送
我需要将一个频道的结果转发到另一个频道。我使用了这样的东西:
for {
select {
...
case ch2 <- (<-ch1):
...
}
}
这似乎工作得很好,但是这里到底发生了什么?select 语句是否选择接收或发送操作或两者?
我知道一个 select 语句可以单独选择:
select {
case ch <- v:
}
select {
case v = <- ch:
}
回答
从文档:
对于语句中的所有情况,接收操作的通道操作数以及发送语句的通道和右侧表达式在进入“选择”语句时按源顺序仅计算一次。结果是一组要接收或发送的通道,以及要发送的相应值。无论选择哪个(如果有)通信操作进行,该评估中的任何副作用都会发生。带有简短变量声明或赋值的 RecvStmt 左侧的表达式尚未计算。
意思是:
case ch2 <- (<-ch1):
将在接收时立即阻塞ch1
,然后select
将控制发送是ch2
发生还是不同case
。
Hymns For Disco 说得很好;theselect
将其视为ch2 <- <something>
, where<something>
在输入select
.
它还具有消耗和丢弃值的副作用,ch1
如果该值case
最终不是被选中的值。