亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

`var a chan int` 和 `a := make(chan int)` 有什么區別?

`var a chan int` 和 `a := make(chan int)` 有什么區別?

Go
catspeake 2023-06-05 09:15:33
今天在學習go的channels和goroutine。我遇到了一些讓我困惑的現象。我的 go 文件如下所示:package mainimport (    "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 +0xc7goroutine 18 [chan send (nil chan)]:main.testRoutine(0x1, 0x0)    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3fcreated by main.main    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:16 +0x7cgoroutine 19 [chan send]:main.testRoutine(0x2, 0xc42008a060)    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3fcreated by main.main    /Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:17 +0xa7var a chan int那么,和有什么區別a := make(chan int),為什么會引發這種恐慌現象呢?
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

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


查看完整回答
反對 回復 2023-06-05
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

回想一下,var name type創建一個名為nametype 的變量type設置為該類型的默認值。這意味著var a chan int創建一個通道,使得a == nil.

var a chan int = make(chan int)但是a := make(chan int),它們是相同的。


查看完整回答
反對 回復 2023-06-05
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

var x chan int只是 'x' 的聲明,您只在堆棧中創建一個 val,而在堆中沒有實際的內存 malloc。但是,

var x chan int
x = make(chan int, 0)

這種方式實際上可以為這個 x 在堆中 malloc 一些內存。

順便說一句,無論是在堆棧中還是在堆中構建的 val 在 golang 中都模糊不清。像map,slice,chan類型的引用類型,make()在使用前都應該使用,否則會panic為nil point error


查看完整回答
反對 回復 2023-06-05
  • 3 回答
  • 0 關注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號