1. channel的select語句
在Go語言,select只能和channel一起使用。
select語句的分支有兩種,一種為case分支,另一種為default分支。
2. select專為操作channel而存在的。每一個case表達式,只能包含操作channel的表達式
package main
import (
"fmt"
"math/rand"
)
func main() {
//準備好幾個通道
intChannels := [3]chan int{
make(chan int, 1),
make(chan int, 1),
make(chan int, 1),
}
//隨機選擇一個通道,並向它發送元素值。
index := rand.Intn(3)
fmt.Printf("The index: %d\n", index)
intChannels[index] <- index
//哪一個通道中有可取的元素值,對應的分支就會被執行。
select {
case <-intChannels[0]:
fmt.Println("The first candidate case is selected.")
case <-intChannels[1]:
fmt.Println("The second candidate case is selected.")
case elem, ok := <-intChannels[2]:
//檢查通道是否關閉
if ok {
fmt.Printf("The third candidate case is selected, the element is %d.\n", elem)
}
default:
fmt.Println("No candidate case is selected!")
}
}
https://play.golang.org/p/UfzHq28E5Rm
3. select 語句,要注意的事情
a. 如果沒有default分支,一旦所有的case表達式,都沒有滿足條件,就會阻塞在select語句,直到至少有一個case表達式滿足條件為止。
b. 有加入default分支,在沒有滿足case表達式時,會選擇default分支,select語句不會被阻塞。
c. 確認channel是否被關閉。 (如上面的範例)
d. select語句只能對其中的每一個case表達式各求值一次。(如需執行多次,需要通過for語句)
參考來源:
郝林-Go语言核心36讲