go语言中的select有些类似于switch也包括case和defult,而select是用来监听和channel有关的IO操作的,当有case中触发发送或接收操作则会被立即执行。如果没有channel的发送操作也没有defult语句,则会被阻塞。
所以每一个case必须有一个通讯,如果多个case都可以执行,select会随机的选出一个执行。在没有channel有IO操作时,如果有defult语句,则会执行该语句,如果没有select将会阻塞,知道某个case下的channel可以通讯。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan bool)
go func() {
time.Sleep(2 * time.Second)
ch1 <- 12
}()
select {
case v1 := <-ch1:
fmt.Println("ch1:", v1)
case v2, ok := <-ch2:
if ok {
fmt.Println("ch2:", v2)
} else {
fmt.Println("ch2 close")
}
case <-time.After(3 * time.Second): // 等待 3s
fmt.Println("time out")
}
}
结果:ch1:12