Select语句用于处理异步IO操作,它监听case语句中的IO操作,当某个IO操作就绪时执行对应的case语句。
select的基本形式是:
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 可有任意数量的case */
default :
statement(s);
}
例如:
func main() {
c1 := make(chan string)
c2 := make(chan string)
go func() {
time.Sleep(1 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(2 * time.Second)
c2 <- "two"
}()
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
上述代码启动两个goroutine在1s和2s后分别发送数据到c1和c2通道。
select会监听c1和c2两个通道的操作,当其中一个通道发送数据并就绪时,立即执行对应case语句。
如果c1通道先就绪,则会打印:
received one
如果c2通道先就绪,则会打印:
received two
如果在1s内两个通道都没有就绪,select会阻塞等待,而不会执行default语句。
select的作用是处理异步IO操作并实现非阻塞的选择语句。它可以监听多个通信操作,当任意一个操作就绪时立即执行,这实现了一种非阻塞的选择机制。