Go 什么';‘var a chan int’和‘a:=make(chan int)’之间的区别是什么?
今天我在学习围棋的频道和路线。我遇到了一些让我困惑的现象 我的go文件如下所示: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
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 errorvar 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)
}