直接从一个频道发送到另一个频道

时间:2016-03-13 03:56:35

标签: go channel

当我从一个频道直接发送到另一个频道时,我偶然发现了我发现的惊人行为:

package main

import (
    "fmt"
)

func main() {
    my_chan := make(chan string)
    chan_of_chans := make(chan chan string)

    go func() {
        my_chan <- "Hello"
    }()

    go func() {
        chan_of_chans <- my_chan
    }()

    fmt.Println(<- <- chan_of_chans)
}

Go Playground

我希望<- my_chan发送"Hello"类型string。但是,它发送类型chan string,我的代码运行正常。这意味着发送的内容(stringchan string)取决于接收者的类型。

我尝试了天真的谷歌搜索,但由于我不熟悉正确的术语,我什么也没想到。是否有与上述行为相关的适当术语?任何额外的见解当然都很棒。

1 个答案:

答案 0 :(得分:9)

我不是百分百肯定我理解这个问题,但让我们试一试。

考虑这一行:

chan_of_chans <- my_chan

您实际执行的操作是将my_chan推送到频道,而不是从my_chan删除某些内容并将其推送到chan_of_chans

如果您想从my_chan中提取某些内容并将其发送到另一个频道,则需要在频道之前使用<-运算符提取它,而不需要空格:

value := <-my_chan
other_chan <- value

或者,这应该有效:

other_chan <- (<-my_chan)