我正在關注 tour.golang.org 上的示例。我主要理解這個例子,我唯一的問題是為什么當我們通過 0 退出頻道時它會停止?不管是否傳遞了 0 來退出,x 總是有一個值。所以不應該選擇總是落在 case 'c <- x' 上嗎?func fibonacci(c chan int, quit chan int) { x, y := 0, 1 for { select { case c <- x: x, y = y, x+y case <-quit: return } } close(c)}func main() { c := make(chan int) quit := make(chan int) go func() { for i := 0; i < 10; i++ { fmt.Println(<-c) } quit <- 0 }() fibonacci(c, quit)}
3 回答

白豬掌柜的
TA貢獻1893條經驗 獲得超10個贊
x 總是有一個值。所以不應該選擇總是落在 case 'c <- x' 上嗎?
不,因為這個通道是無緩沖的,發送將阻塞,直到有人可以從它接收。
閱讀關于Effective Go 的頻道:
接收器總是阻塞直到有數據要接收。如果通道未緩沖,則發送方將阻塞,直到接收方收到該值。如果通道有緩沖區,則發送方只會阻塞,直到值被復制到緩沖區;如果緩沖區已滿,這意味著等待某個接收器檢索到一個值。
此外,如果 select 語句中的 2 個 case 可以繼續,則偽隨機選擇一個。
如果可以進行一個或多個通信,則通過統一偽隨機選擇選擇可以進行的單個通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”語句會阻塞,直到至少有一個通信可以繼續。
- 3 回答
- 0 關注
- 236 瀏覽
添加回答
舉報
0/150
提交
取消