select 默认是阻塞的,只有当监听的 channel 中有发送或接收可以进行时才会运行,当多个 channel 都准备好的时候,select 是随机的选择一个执行的。
监听触发执行
package main
import (
"fmt"
"time"
)
func main() {
a := make(chan int)
b := make(chan int)
fun := func() {
select {
case <-a:
fmt.Println("aa")
case <-b:
fmt.Println("bb")
}
}
go func() {
time.Sleep(2 * time.Second)
a<-1
}()
go func() {
time.Sleep(1 * time.Second)
b<-1
}()
fun()
fun()
}
以上程序始终输出
监听随机执行
package main
import (
"fmt"
"time"
)
func main() {
a := make(chan int)
b := make(chan int)
fun := func() {
select {
case <-a:
fmt.Println("aa")
case <-b:
fmt.Println("bb")
}
}
go func() {
time.Sleep(1 * time.Second)
a<-1
}()
go func() {
time.Sleep(1 * time.Second)
b<-1
}()
fun()
fun()
}
以上程序始终输出