select的作用
Go里面提供了一个关键字 select
, 通过 select
可以监听channel上的数据流动.
select
的用法与 switch
语言非常类似, 由 select
开始一个新的选择块, 每个选择条件由 case
语句来描述.
与 switch
语句相比, select
有比较多的限制, 其中最大的一条限制就是每个case语句里必须是一个IO操作.
大致的结构如下:
select {
case <- chan1:
// 如果chan1成功读到数据, 则进行该case处理语句
case chan2 <- -1:
// 如果成功向chan2写入数据, 则进行该case处理语句
default:
// 如果上面都没有成功, 则进入default处理流程
}
在一个 select
语句中, Go语言会按照顺序从头至尾评估每一个发送和接收的语句.
如果其中的任意一条语句可以继续执行(即没有阻塞), 那么就从那些可以执行的语句中任意选择一条来使用.
如果没有任意一条语句可以执行(即所有的通道都被阻塞), 那么有两种可能的情况:
- 如果给出了default语句, 那么就会执行default语句, 同时程序的执行会从select语句后的语句中恢复.
- 如果没有default语句, 那么select语句将被阻塞, 直到至少有一个通信可以进行下去.
select的基本使用
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
ch := make(chan int) // 用来进行数据通信的channel
quit := make(chan bool) // 用来判断是否退出的channel
go func() {
// 写数据
for i:=0; i <