先看代碼:
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(1)
int_chan := make(chan int, 1)
string_chan := make(chan string, 1)
int_chan <- 1
string_chan <- "hello"
select {
case value := <-int_chan:
fmt.Println(value)
case value := <-string_chan:
panic(value)
}
fmt.Println(123)
}
運(yùn)行兩次恕齐,結(jié)果分別為:
E:\go_study>go run 4.go
1
123
E:\go_study>go run 4.go
1
123
E:\go_study>go run 4.go
1
123
E:\go_study>go run 4.go
1
123
E:\go_study>go run 4.go
panic: hello
goroutine 1 [running]:
main.main()
E:/go_study/4.go:18 +0x2f4
exit status 2
E:\go_study>
發(fā)現(xiàn)沒(méi)有,如果兩個(gè)case都滿(mǎn)足條件剃斧,是偽隨機(jī)選擇一個(gè)執(zhí)行的轨香,而不是之前想著的從上到下依次判斷哪個(gè)case能執(zhí)行。
還有一點(diǎn)幼东,當(dāng)某個(gè)case得到執(zhí)行后臂容,就會(huì)退出select,因?yàn)榇蛴〕隽?123 根蟹。
最后一點(diǎn)脓杉,如果沒(méi)有case可以執(zhí)行,則立即執(zhí)行default简逮,然后退出select球散。