Go 在语言级别支持 select 关键字,用于处理异步 IO 问题。
在用法方面,select 的用法与 switch 语言非常相似,由 select 开始一个新的选择块,每个选择条件由 case 语句来描述。
select 有比较多的限制,其中最大的一条限制就是每个 case 语句里必须是一个 IO 操作,
select {
case <- chan1:
// 如果 chan1 成功读到数据,则进行该 case 处理语句
case chan2 <- 1:
// 如果成功向 chan2 写入数据,则进行该 case 处理语句
default:
// 如果上面都没有成功,则进入 default 处理流程
}
select 后面并不带判断条件,而是直接去查看 case 语句。每个 case 语句都必须是一个面向 channel 的操作。
实现一个 channel 的例子:
ch := make(chan int, 1)
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println("Value received:", i)
}
以上,实现了一个随机向 ch 中写入一个 0 或者 1 的过程。