亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Go 中使用通道的斐波那契數列

Go 中使用通道的斐波那契數列

Go
MMTTMM 2021-10-11 13:45:50
我正在關注 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”語句會阻塞,直到至少有一個通信可以繼續。


查看完整回答
反對 回復 2021-10-11
  • 3 回答
  • 0 關注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號