為什么像這樣簡單的事情不起作用?c1 := make(chan string)c1 <- "foo"fmt.Println(<-c1)但是如果我把它放在一個 go 例程中它會起作用嗎?c1 := make(chan string)go func() { c1 <- "foo"}()fmt.Println(<-c1)這個問題可能看起來簡單而愚蠢,但我試圖理解為什么我不能這樣做,在這種情況下我不知道有什么更好的問題可以問。
1 回答

夢里花落0921
TA貢獻(xiàn)1772條經(jīng)驗 獲得超6個贊
通道 c1 是一個無緩沖通道。只有當(dāng)發(fā)送方和接收方都準(zhǔn)備好時,才能在無緩沖通道上成功通信。
線路c1 <- "foo永遠(yuǎn)阻塞,因為沒有接收器準(zhǔn)備好。
帶有 goroutine 的程序可以工作,因為發(fā)送和接收 goroutine 會運行到發(fā)送方和接收方都準(zhǔn)備就緒的點。
該程序也將起作用:
c2 := make(chan string, 1) // <-- note channel size of one
c2 <- "foo"
fmt.Println(<-c2)
通道 c2 在這個程序中被緩沖。c2 <- "foo"由于緩沖區(qū)未滿,發(fā)送繼續(xù)進(jìn)行。
- 1 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報
0/150
提交
取消