在 Go 语言中,select
语句用于监听多个通道的操作。它类似于 switch
语句,但用于处理多个通道的通信情况。
select
语句会阻塞直到其中的一个通道操作可以进行,如果有多个通道操作可以进行,则随机选择一个执行。
以下是一个简单的 select
示例:
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch1 <- "Message from ch1"
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- "Message from ch2"
}()
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
}
在上述示例中,select
语句会等待 ch1
或 ch2
中有数据可读,然后执行相应的分支。
上述代码的运行结果是 `Message from ch2` 。
因为 `ch2` 的发送操作在 `ch1` 之前完成,所以当 `select` 语句执行时,`ch2` 可能已经准备好接收数据,从而执行对应的分支输出 `Message from ch2` 。
但需要注意的是,由于 `select` 在多个通道都准备好时的选择是随机的,所以在实际运行中也有可能先输出 `Message from ch1` ,但这种情况相对较少。