登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-21 14:27:30 326浏览 收藏

在 Go 语言中,`var a chan int` 和 `a := make(chan int)` 之间存在差异。`var a chan int` 创建一个未初始化的通道变量,默认值为 `nil`,而 `a := make(chan int)` 创建一个无缓冲的通道,可立即使用。使用 `var` 创建的 `nil` 通道会导致程序死锁,因为无法向其中发送数据。

问题内容

今天学习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)
}

当我使用语法 a := make(chan int) 时效果很好。

但是当我将 a := make(chan int) 更改为 var a chan int 时,我收到了恐慌报告:

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) 之间有什么区别,以及为什么会引发这种恐慌现象呢?


解决方案


回想一下,var name type 创建了一个名为 name 的变量,其类型为 type,并设置为该类型的默认值。这意味着 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)
}

前往演示链接:https://play.golang.org/p/Bxr6qRfNqZd

本篇关于《有什么区别:`var a chan int` 和 `a := make(chan int)` 》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>