首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`var a chan int’和‘a := make(chan Int)’之间有什么区别?

‘`var a chan int’和‘a := make(chan Int)’之间有什么区别?
EN

Stack Overflow用户
提问于 2019-01-29 03:50:14
回答 2查看 2.3K关注 0票数 6

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

我的go文件如下:

代码语言:javascript
复制
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时,我收到了恐慌报告:

代码语言:javascript
复制
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)之间有什么区别吗?为什么会引发这种恐慌现象?

EN

回答 2

Stack Overflow用户

发布于 2019-01-29 03:57:35

a := make(chan int)创建未缓冲的通道。有零缓冲器的频道。你可以通过它发送数据。

var a chan int创建通道变量并将其设置为默认值,即nil。而且一个通道总是被阻塞,这就是为什么你的程序陷入僵局。无法在信道中发送数据。

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

代码语言:javascript
复制
package main

import (
    "fmt"
)

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

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

票数 12
EN

Stack Overflow用户

发布于 2019-01-29 07:10:07

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

代码语言:javascript
复制
var x chan int
x = make(chan int, 0)

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

顺便说一句,不管是堆叠里的瓦尔,还是堆里的瓦勒,都会在金刚被模糊地分开。对于地图、切片、chan等引用类型,它们都应该在投入使用前进行make(),否则就会恐慌为零点错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54413564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档