这是Go中的Concurrency in一书中的代码示例。在select块中是以下语句
case takeStream <- <- valueStream:
我不知道双箭头的作用,并且文本中没有解释。当我用
替换输出时,输出会更改case takeStream <- valueStream:
因此显然有必要
完整功能:
func take(done<- chan interface{}, valueStream <- chan interface{}, num int) <- chan interface{}{
takeStream := make ( chan interface{})
go func() {
defer close(takeStream)
for i := 0; i < num; i ++ {
select {
case <- done :
return
case takeStream <- <- valueStream:
}
}
}()
return takeStream
}
[takeStream <- <- valueStream
是接收操作(receive operator)和send statement的串联。
接收运算符是一元运算符,因此具有最高优先级(Spec: Operators),而send语句是一个语句,并且不在运算符层次结构中。结果,c1 <- <- c2
与c1 <- (<-c2)
相同。
所以您的例子与:
takeStream <- (<-valueStream)
和规范:发送语句:
在通信开始之前先评估通道和值表达式。
要发送的值必须先经过评估,然后才能发送。因此,您的示例首先从valueStream
接收一个值,然后在takeStream
上发送该值。