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

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

為什么這段代碼會產(chǎn)生錯誤?

為什么這段代碼會產(chǎn)生錯誤?

Go
慕慕森 2021-11-22 15:07:29
下面的一段代碼為什么會產(chǎn)生錯誤?func main() {    messages := make(chan string)    messages <- "test" //line 16    fmt.Println(<-messages)}生成以下錯誤。fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan send]:main.main()    /tmp/sandbox994400718/main.go:16 +0x80一個值被發(fā)送到通道,并在下一行被接收。從技術(shù)上講,它應(yīng)該可以工作。
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗 獲得超16個贊

通道可以是有緩沖的無緩沖的。一個緩沖通道可以在它的“內(nèi)部”存儲許多項目,但是當(dāng)你向緩沖通道添加一些東西時,添加項目的 goroutine 只能在另一個 goroutine 刪除項目時繼續(xù)。沒有地方可以“離開”這個項目,它必須直接傳遞給另一個 goroutine,第一個 goroutine 會等到另一個 goroutine 從它那里拿走這個項目。

這就是您的代碼中發(fā)生的事情。當(dāng)您使用 來創(chuàng)建頻道時make,如果您沒有將容量指定為第二個參數(shù),您將獲得一個無緩沖頻道。要創(chuàng)建緩沖通道,請將第二個參數(shù)傳遞給make,例如。

messages := make(chan string, 1) // could be larger than 1 if you want

這允許 goroutine 將項目(string在本例中為a )添加到通道中,當(dāng)另一個 goroutine 將來嘗試從通道中獲取項目時,該項目將可用,然后原始 goroutine 可以繼續(xù)處理。


查看完整回答
反對 回復(fù) 2021-11-22
?
慕俠2389804

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

我現(xiàn)在已經(jīng)了解了很多關(guān)于頻道的知識,現(xiàn)在我可以回答這個問題了。


在第 16 行,當(dāng)主線程(goroutine)將消息“test”發(fā)送到通道時,執(zhí)行會暫停,運行時會尋找其他準(zhǔn)備好從通道消息接收值的 goroutine。由于沒有其他通道,運行時會引發(fā)帶有死鎖消息的恐慌。這是死鎖的典型例子。


要解決這個問題,可以做兩件事。


1)按照馬特的建議使用緩沖通道(答案之一)。


2) 否則在 goroutine 中有發(fā)送到 channel 或從 channel 接收的語句。


func main() {


    messages := make(chan string)


    go func() {

        messages <- "test" //line 16

    }()

    fmt.Println(<-messages)


}

所以最重要的一點是,


1) 通道只能用于 goroutines 之間的通信,即當(dāng)你發(fā)送到一個 goroutine 中的通道時,你只能在另一個不同的 goroutine 中接收它。


2) 當(dāng)數(shù)據(jù)發(fā)送到 goroutine 中的通道時,該 goroutine 的流程/執(zhí)行將暫停,直到從另一個 goroutine 中的同一通道接收到數(shù)據(jù)。


查看完整回答
反對 回復(fù) 2021-11-22
  • 2 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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