为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMMHUHU 2022-11-23 20:18:51

下面的代码工作正常


func main() {

    c := make(chan string)

    go subRountine(c)

    fmt.Println(<-c)

}


func subRountine(c chan string) {

    c <- "hello"

}


有没有其他方法可以在没有 make 功能的情况下创建频道?像这样,但这个示例不起作用


func main() {

    var c chan string

    go subRountine(c)

    fmt.Println(<-c)

}


func subRountine(c chan string) {

    c <- "hello"

}


查看完整描述

2 回答

?
有只小跳蛙

TA贡献1539条经验 获得超7个赞

不!声明通道与var创建通道不同。那么你应该创建make

  var c chan string
  c = make(chan string)

不同之处在于,现在您可以在底层作用域中创建 c 并在它们之外使用它。

请注意,您不应该以这种方式将冒号放在等号之前。


查看完整回答
反对 回复 2022-11-23
?
陪伴而非守候

TA贡献1493条经验 获得超8个赞

长话短说

没办法:你必须使用make.

更多细节

var c chan string

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

未初始化通道的值为nil.

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

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

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

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

make(chan int, 100)


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信