1. select語句的case表達式,都會在選擇之前,先被求值。
2. case表達式,求值的順序,會依照程式碼的編寫順序,從上而下。
而同一個case表達式中的求值順序,從左邊到右邊。
3. 當select語句中的所有case表達式都被求值完畢後,才會開始選擇case分支。
只會選擇滿足條件的case分支,如果所有的case分支都不滿足條件,就會選擇default分支。
如果沒有default分支,就會阻塞在select語句,直到至少有一個case分支滿足條件。
4. 如果select語句,發現同時有多個case分支滿足條件,Go語言會用隨機的算法,選擇符合條件的一個case分支。
package main
import "fmt"
var channels = [3]chan int{
nil,
make(chan int), //沒有buffer
make(chan int, 1), //有buffer,可以放元素值
}
var numbers = []int{1, 2, 3}
func main() {
select {
//先對每一個case表達式求值,才選擇case分支
case getChan(0) <- getNumber(0):
fmt.Println("The first candidate case is selected.")
case getChan(2) <- getNumber(2):
fmt.Println("The third candidate case is selected")
case getChan(1) <- getNumber(1):
fmt.Println("The second candidate case is selected.")
default:
fmt.Println("No candidate case is selected!")
}
}
func getNumber(i int) int {
fmt.Printf("numbers[%d]\n", i)
return numbers[i]
}
func getChan(i int) chan int {
fmt.Printf("channels[%d]\n", i)
return channels[i]
}
https://play.golang.org/p/OJePyINYVAn
參考來源:
郝林-Go语言核心36讲