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

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

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

Go
catspeake 2023-06-05 09:15:33
今天在学习go的channels和goroutine。我遇到了一些让我困惑的现象。我的 go 文件如下所示:package mainimport (    "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)}当我使用 syntax 时效果很好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 +0xc7goroutine 18 [chan send (nil chan)]:main.testRoutine(0x1, 0x0)    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3fcreated by main.main    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:16 +0x7cgoroutine 19 [chan send]:main.testRoutine(0x2, 0xc42008a060)    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3fcreated by main.main    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:17 +0xa7var a chan int那么,和有什么区别a := make(chan int),为什么会引发这种恐慌现象呢?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

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


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


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


package main


import (

    "fmt"

)


func main() {

    var i chan int

    fmt.Println(i)

    a := make(chan int)

    fmt.Println(a)

}

去游乐场链接:https://play.golang.org/p/Bxr6qRfNqZd


查看完整回答
反对 回复 2023-06-05
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

回想一下,var name type创建一个名为nametype 的变量type设置为该类型的默认值。这意味着var a chan int创建一个通道,使得a == nil.

var a chan int = make(chan int)但是a := make(chan int),它们是相同的。


查看完整回答
反对 回复 2023-06-05
?
吃鸡游戏

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

var x chan int只是 'x' 的声明,您只在堆栈中创建一个 val,而在堆中没有实际的内存 malloc。但是,

var x chan int
x = make(chan int, 0)

这种方式实际上可以为这个 x 在堆中 malloc 一些内存。

顺便说一句,无论是在堆栈中还是在堆中构建的 val 在 golang 中都模糊不清。像map,slice,chan类型的引用类型,make()在使用前都应该使用,否则会panic为nil point error


查看完整回答
反对 回复 2023-06-05
  • 3 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

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