第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么延遲函數(shù)不執(zhí)行?

為什么延遲函數(shù)不執(zhí)行?

Go
開(kāi)滿天機(jī) 2022-05-23 16:13:09
我正在努力理解 Go 中的并發(fā)性。package mainimport "fmt"func sendValues(myIntChannel chan int) {    for i := 0; i < 5; i++ {        myIntChannel <- i //sending value    }}func main() {    myIntChannel := make(chan int)    defer close(myIntChannel)    go sendValues(myIntChannel)    for value := range myIntChannel {        fmt.Println(value) //receiving value    }}上面的代碼給出了以下輸出:01234fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main()    /Users/spikki/Desktop/GoLearning/go_channel.go:51 +0x10b據(jù)我了解, defer 函數(shù)將在其周邊函數(shù)完成后執(zhí)行。我無(wú)法解釋它。如果我使用 for 循環(huán)從通道接收值,它的工作方式如下。for i := 0; i < 5; i++ {    fmt.Println(<-myIntChannel) //receiving value}誰(shuí)能幫我理解這個(gè)概念?
查看完整描述

2 回答

?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

for ... range只有在從通道接收到所有值并且通道已關(guān)閉時(shí),通道才會(huì)終止。


在您的示例中,您希望在延遲函數(shù)中關(guān)閉通道,但這只會(huì)在main()返回時(shí)運(yùn)行。但main()只有在循環(huán)結(jié)束時(shí)才會(huì)返回。這就是死鎖的原因。for循環(huán)等待通道關(guān)閉,關(guān)閉通道等待 for 循環(huán)結(jié)束。


當(dāng)您使用循環(huán)從通道中準(zhǔn)確接收 5 個(gè)值時(shí),它會(huì)起作用,因?yàn)閱?dòng)的 goroutines 會(huì)在其上發(fā)送 5 個(gè)值。此循環(huán)不會(huì)等待通道關(guān)閉,因此循環(huán)可以結(jié)束,main()函數(shù)也可以結(jié)束。


這就是為什么發(fā)送者應(yīng)該關(guān)閉通道(而不是接收者),并且問(wèn)題立即得到解決:


func sendValues(myIntChannel chan int) {

    for i := 0; i < 5; i++ {

        myIntChannel <- i //sending value

    }

    close(myIntChannel)

}


func main() {

    myIntChannel := make(chan int)

    go sendValues(myIntChannel)


    for value := range myIntChannel {

        fmt.Println(value) //receiving value

    }

}

輸出(在Go Playground上試試):


0

1

2

3

4


查看完整回答
反對(duì) 回復(fù) 2022-05-23
?
四季花海

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊

用不同的術(shù)語(yǔ)來(lái)解釋它,您的代碼所做的是:


func main() {

    ...

    while myIntChannel is not closed {

        ...

    }

    close myIntChannel 

}

現(xiàn)在你可以看到死鎖是從哪里來(lái)的。


雖然上述答案是有效的,但如果您更喜歡使用,您也可以試試這個(gè)defer:


func sendValues(myIntChannel chan int) {

    defer close(myIntChannel)

    for i := 0; i < 5; i++ {

        myIntChannel <- i //sending value

    }

}


func main() {

    myIntChannel := make(chan int)


    go sendValues(myIntChannel)


    for value := range myIntChannel {

        fmt.Println(value) //receiving value

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-05-23
  • 2 回答
  • 0 關(guān)注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)