我已將通道緩沖區大小設置為零,例如var intChannelZero = make(chan int),當從中獲取值時intChannelZero將被阻塞,直到intChannelZero具有值。此外,我將通道緩沖區大小設置為 1,例如var intChannelOne = make(chan int, 1),當從 獲取值時intChannelOne將被阻塞,直到intChannelOne具有值。我們知道的容量intChannelZero是零,容量intChannelOne是一,所以我想知道:intChannelZero給like賦值時intChannelZero <- 1,值保存在哪里?為它們賦值時intChannelZero以及賦值時的差異。intChannelOne誰能在Golang Runtime Enviroment 層面解釋一下?多謝。
2 回答

心有法竹
TA貢獻1866條經驗 獲得超5個贊
如果通道是無緩沖的(容量為零),則只有當發送方和接收方都準備就緒時,通信才會成功。
如果通道已緩沖(容量 >= 1),則如果通道未滿則發送成功且不會阻塞,如果緩沖區不為空則接收成功且不會阻塞。
當像 intChannelZero <- 1 那樣將值賦給 intChannelZero 時,該值保存在哪里?
該值從發送方復制到接收方。除了實現可能使用的任何臨時變量外,該值不會保存在任何地方。
intChannelZero 和 intChannelOne 賦值時的區別。
在 intChannelZero 塊上發送,直到接收器準備就緒。
發送 intChannelOne 塊,直到緩沖區中有可用空間。

拉丁的傳說
TA貢獻1789條經驗 獲得超8個贊
無緩沖和緩沖通道的區別在于,
發送到頻道被阻止
從通道接收被阻止
對于無緩沖通道
如果頻道已經發送消息但尚未收到,則發送將被阻止。
如果從未發生過發送,則接收將被阻止。
對于緩沖通道
如果已經發生 n(channel size) 次發送并且沒有收到任何發送,則發送將被阻止。即整個通道大小已被發送的消息使用,但沒有收到任何消息。
如果緩沖區為空,即沒有任何未使用的發送,則接收將被阻止
運行時錯誤
接收阻塞將拋出波紋管錯誤
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]:
發送被阻止將拋出波紋管錯誤
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]:
- 2 回答
- 0 關注
- 268 瀏覽
添加回答
舉報
0/150
提交
取消