我可以不使用 make 函数来创建频道吗?

Fra*_*ung 1 channel go

下面的代码工作正常

func main() {
    c := make(chan string)
    go subRountine(c)
    fmt.Println(<-c)
}

func subRountine(c chan string) {
    c <- "hello"
}

Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以不使用 make 函数来创建通道?像这样的东西,但这个示例不起作用

func main() {
    var c chan string
    go subRountine(c)
    fmt.Println(<-c)
}

func subRountine(c chan string) {
    c <- "hello"
}

Run Code Online (Sandbox Code Playgroud)

jub*_*0bs 6

长话短说

没有办法解决这个问题:你必须使用make.

更多细节

var c chan string
Run Code Online (Sandbox Code Playgroud)

只是声明了一个通道变量,但没有初始化通道!这是有问题的,因为正如语言规范所说,

未初始化通道的值为nil。

和

通道nil永远不会准备好进行通信。

换句话说,向nil通道发送和/或接收是阻塞的。尽管nil通道值可能很有用,但如果您想在通道上执行通道通信(发送或接收),则必须在某个阶段初始化通道。

正如 mkopriva 在他的评论中所写,Go 只提供了一种初始化通道的方法:

可以使用内置函数 来创建新的初始化通道值make,该函数将通道类型和可选容量作为参数:

make(chan int, 100)
Run Code Online (Sandbox Code Playgroud)