gpt4 book ai didi

go - `var a chan int` 和 `a := make(chan int)` 有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 01:19:08 25 4
gpt4 key购买 nike

今天我在学习 channels 和 goroutine of go。我遇到了一些让我困惑的现象。

我的 go 文件如下所示:

package main

import (
"fmt"
)

func testRoutine(number int, channel chan int) {
channel <- number
}


func main() {
// var a chan int
a := make(chan int)
b := make(chan int)
go testRoutine(1, a)
go testRoutine(2, b)

c, d := <-a, <-b
fmt.Printf("%d %d\n", c, d)
}

当我使用语法 a := make(chan int) 时效果很好。

但是当我将 a := make(chan int) 更改为 var a chan int 时,我得到了 panic 报告:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive (nil chan)]:
main.main()
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:19 +0xc7

goroutine 18 [chan send (nil chan)]:
main.testRoutine(0x1, 0x0)
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3f
created by main.main
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:16 +0x7c

goroutine 19 [chan send]:
main.testRoutine(0x2, 0xc42008a060)
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3f
created by main.main
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:17 +0xa7

那么,var a chan inta := make(chan int)有什么区别,为什么会引发这种panic现象呢?

最佳答案

a := make(chan int) 创建无缓冲 channel 。那个缓冲区为零的 channel 。您可以通过它发送数据。

var a chan int 创建 channel 变量并将其设置为默认值 nil。而一个 nil channel 总是阻塞的,这就是你的程序陷入僵局的原因。您不能在 nil channel 中发送数据。

如果打印这些值,您会看到差异。

package main

import (
"fmt"
)

func main() {
var i chan int
fmt.Println(i)
a := make(chan int)
fmt.Println(a)
}

Go Playground 链接:https://play.golang.org/p/Bxr6qRfNqZd

关于go - `var a chan int` 和 `a := make(chan int)` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54413564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com