【问题标题】:chanA <- chanB : send and receive value or send channel itself?chanA <- chanB : 发送和接收值还是发送通道本身?
【发布时间】:2019-10-19 01:15:46
【问题描述】:

Go 编译器似乎会根据以下示例中的类型执行两种完全不同的语义操作:

chanA

如果 chanA 是 type (chan chan

但是,如果 chanA 的类型是 (chan

这是了解类型的唯一方法,还是有一种简单的方法可以判断通道何时发送值与自身?

我正在查看 Go Programming Book 中的这个示例:https://github.com/adonovan/gopl.io/blob/master/ch8/chat/chat.go

【问题讨论】:

    标签: go channels


    【解决方案1】:

    这很容易分辨。

    chanA <- anything
    

    无论anything 是什么,都在chanA 上发送值anything

    chanA <- <- chanB
    

    正在从chanB 接收一个值并将其发送到chanA

    您的第二个声明:

    但是,如果 chanA 是类型 (chan

    是你的问题。 foo &lt;- bar 始终是一个发送操作。 Go 编译器从左到右读取,identifier &lt;- 是一个发送操作。

    接收操作是一个计算值的表达式,因此它只能在值有效的情况下有效 - 即编译器必须已经遇到了赋值操作的第一部分,发送操作,函数调用,等等

    【讨论】:

      【解决方案2】:

      你的假设是错误的。

      chanA <- chanB
      

      仅当chanA 的类型为chan chan something 时,上述内容才有效。它将通过chanA 发送chanB。它不会从chanB 读取。

      要从chanB 读取值并将其发送到chanA,您需要:

      chanA <- <- chanB
      

      【讨论】:

        猜你喜欢
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-09
        • 2020-04-14
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        相关资源
        最近更新 更多