select case 每次都會隨機選擇一個已進入『備妥』狀態的 case 來執行
而且每一輪進入 select 時,每一個 case 被選中的機率都一樣
不會輪流選擇,完全是隨機。
下面範例是網路上抓來修改的
每個 case 增加一個計數器
最後將進入每個 case 的次數印出
從執行結果可以看到,每次進入 select
每一個 case 後的函數都會被呼叫一次
但是最後只會隨機選擇一個 case 進入
Code:
package main
import (
"fmt"
)
func main() {
ch1 := make(chan bool, 1)
c1, c2, c3, c4, c5 := 0, 0, 0, 0, 0
func() {
defer func() {
fmt.Println(c1, c2, c3, c4, c5)
}()
for {
fmt.Println("start")
select {
case ch1 <- callMe("c1"):
c1++
fmt.Println("in case1")
case ch1 <- callMe("c2"):
c2++
fmt.Println("in case2")
case ch1 <- callMe("c3"):
c3++
fmt.Println("in case3")
case ch1 <- callMe("c4"):
c4++
fmt.Println("in case4")
case ch1 <- callMe("c5"):
c5++
fmt.Println("in case5")
}
fmt.Println("end")
<-ch1
if c1+c2+c3+c4+c5 >= 100 {
return
}
}
}()
}
func callMe(s string) bool {
fmt.Println("in", s)
return true
}
每次跑完的結果都會不同,下面列出跑3次的結果
Result:
23 18 17 30 12
21 18 18 24 19
26 11 20 25 18
http://play.golang.org/p/ky75RbvoEz