当一个通道使用两个箭头写入go中的另一个通道是什么意思

问题描述 投票:2回答:1

这是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
}
go concurrency channels
1个回答
1
投票

[takeStream <- <- valueStream是接收操作(receive operator)和send statement的串联。

接收运算符是一元运算符,因此具有最高优先级(Spec: Operators),而send语句是一个语句,并且不在运算符层次结构中。结果,c1 <- <- c2c1 <- (<-c2)相同。

所以您的例子与:

takeStream <- (<-valueStream)

和规范:发送语句:

在通信开始之前先评估通道和值表达式。

要发送的值必须先经过评估,然后才能发送。因此,您的示例首先从valueStream接收一个值,然后在takeStream上发送该值。

© www.soinside.com 2019 - 2024. All rights reserved.