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

Sending directly from one channel to another

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

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)取决于接收方的类型。

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

我不是 100% 确定我理解这个问题,但让我们试一试。

考虑这一行:

chan_of_chans <- my_chan

您实际上在做的是将 my_chan 推入频道,而不是从 my_chan 中删除某些内容并将其推入 chan_of_chans

如果你想从 my_chan 中提取一些东西并将它发送到另一个频道,你需要在没有 space 的频道之前使用 <- 运算符来提取它:

value := <-my_chan
other_chan <- value

或者,这应该有效:

other_chan <- (<-my_chan)