Go 什么';‘var a chan int’和‘a:=make(chan int)’之间的区别是什么?

Go 什么';‘var a chan int’和‘a:=make(chan int)’之间的区别是什么?,go,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 testR

今天我在学习围棋的频道和路线。我遇到了一些让我困惑的现象

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

那么,
var a chan int
a:=make(chan int)
之间有什么区别吗?为什么会触发这种恐慌现象?

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

var a chan int=make(chan int)
a:=make(chan int)
是相同的。

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)
}

Go Playerd链接:

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

var x chan int
x=制造(成交量,0)
这种方法实际上可以为这个x在堆中malloc一些内存


顺便说一下,在golang中,无论是在堆栈中构建的val还是在堆中构建的val都会被模糊地区分开来。对于map、slice、chan type等引用类型,它们在投入使用之前都应该
make()
,否则它会死机,因为nil point error

var a=make(chan int)也将是sameA简单的深度答案、无缓冲和零通道
var a chan int
a:=make(chan int)
不是一回事。
package main

import (
    "fmt"
)

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