下面的代码工作正常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贡献1824条经验 获得超8个赞
不!声明通道与var
创建通道不同。那么你应该创建make
:
var c chan string c = make(chan string)
不同之处在于,现在您可以在底层作用域中创建 c 并在它们之外使用它。
请注意,您不应该以这种方式将冒号放在等号之前。
陪伴而非守候
TA贡献1757条经验 获得超8个赞
长话短说
没办法:你必须使用make
.
更多细节
var c chan string
仅仅声明了一个通道变量,但没有初始化通道!这是有问题的,因为正如语言规范所说
未初始化通道的值为
nil
.
和
nil
通道永远不会准备好进行通信。
换句话说,向nil
通道发送和/或接收是阻塞的。尽管nil
通道值可能很有用,但如果您想在通道上执行通道通信(发送或接收),则必须在某个阶段初始化通道。
正如 mkopriva 在他的评论中所写,Go 只提供了一种初始化通道的方法:
可以使用内置函数创建一个新的初始化通道值
make
,该函数将通道类型和可选容量作为参数:make(chan int, 100)
- 2 回答
- 0 关注
- 72 浏览
添加回答
举报
0/150
提交
取消