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

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


我的 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)

}

当我使用 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 +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 int那么,和有什么区别a := make(chan int),为什么会引发这种恐慌现象呢?


catspeake
浏览 151回答 3
3回答

侃侃无极

a := make(chan int)创建无缓冲通道。那个缓冲区为零的通道。您可以通过它发送数据。var a chan int创建通道变量并将其设置为默认值nil。一个nil通道总是阻塞的,这就是你的程序陷入僵局的原因。您不能在nil通道中发送数据。如果打印这些值,您将看到差异。package mainimport (&nbsp; &nbsp; "fmt")func main() {&nbsp; &nbsp; var i chan int&nbsp; &nbsp; fmt.Println(i)&nbsp; &nbsp; a := make(chan int)&nbsp; &nbsp; fmt.Println(a)}去游乐场链接:https://play.golang.org/p/Bxr6qRfNqZd

慕尼黑的夜晚无繁华

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

吃鸡游戏

var x chan int只是 'x' 的声明,您只在堆栈中创建一个 val,而在堆中没有实际的内存 malloc。但是,var&nbsp;x&nbsp;chan&nbsp;int x&nbsp;=&nbsp;make(chan&nbsp;int,&nbsp;0)这种方式实际上可以为这个 x 在堆中 malloc 一些内存。顺便说一句,无论是在堆栈中还是在堆中构建的 val 在 golang 中都模糊不清。像map,slice,chan类型的引用类型,make()在使用前都应该使用,否则会panic为nil point error
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go