golang當中對select的理解

huxiaobai_001發表於2020-08-25

Select 語句和 Swithc 語句的句式十分相似,但是 Select 中的 Case 必須是一個通訊操作(一個 Channel 操作)。其執行邏輯是:哪一個 Case 後面的 Channel 操作可以被成功執行,則執行該 Case 下的程式碼塊。如果同時多個 Case 可被成功執行,則隨機選擇其中一個。如果所有 Case 均不可被成功執行,則執行 default 下的程式碼塊。如果沒有 default 則會阻塞並返回死鎖錯誤。

監聽 IO 操作,當 IO 操作發生時,觸發相應的動作
這個說法是對的,監聽(Channel 的) IO 操作並作出相應動作確實是 Select 的應用場景,但是千萬不要誤以為 Select 語句是在選擇哪個 case 下的 Channel 操作被執行了!這麼理解是錯的!Select 真正會選擇的是哪個 case 下的 Channel 操作可以被成功執行,則執行該 case 下的程式碼塊。

比如,當一個 Channel c1 被寫入一條資料

c1 := make(chan string, 1)
c1 <- "Hello World!"

如果我們有以下 Select 判斷語句

select {
    case <-c1:
        fmt.Println("Case 1 is selected")
    case c1<-"Hello World!":
        fmt.Println("Case 2 is selected")
    default :
        fmt.Println("Default is selected")
}

你會得到如下結果

Case 1 is selected

因為 c1 被寫入了一條資料,所以我們可以成功 “從 c1 讀出一條資料”。也就是第一個 case 可以被成功執行。所以,第一個 case 下的程式碼塊最終被執行。

更多解釋案例:studygolang.com/articles/7203

本作品採用《CC 協議》,轉載必須註明作者和本文連結
胡軍

相關文章