在同一个选择案例中接收和发送

我需要将一个频道的结果转发到另一个频道。我使用了这样的东西:

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最终不是被选中的值。


以上是在同一个选择案例中接收和发送的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>