在线文档 > Golang练习 > 通道选择器-select
Go 的 select
关键字 可以等待多个通道操作。将 协程 和 通道 与 select 结合使用是 Go 的一个强大功能。
package main
import (
"fmt"
"time"
)
func main() {
// 在这个例子中,我们将选择两个通道。
c1 := make(chan string)
c2 := make(chan string)
// 每个通道都将在一定时间后接收到一个值,以模拟并发 协程 中的阻塞 RPC 操作执行。
go func() {
time.Sleep(1 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(2 * time.Second)
c2 <- "two"
}()
// 我们将使用 `select` 关键字 同时等待这两个值,并在每个值到达时将其打印出来。
for i := 0; i < 2; i++ {
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
}
运行结果如下:
$ time go run select.go
received one
received two
real 0m2.245s
我们按预期收到值“one”,然后是“two”。
注意,程序总共仅运行了两秒左右。因为 1 秒 和 2 秒的 Sleeps 是并发执行的,