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ù)處理。

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ù)。
- 2 回答
- 0 關(guān)注
- 182 瀏覽
添加回答
舉報