![04c93cf1b41e16a003d53de2561222dc.png](https://img-blog.csdnimg.cn/img_convert/04c93cf1b41e16a003d53de2561222dc.png)
基本使用
select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。
select中的case语句必须是一个channel操作select中的default子句总是可运行的。
- 如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。
- 如果没有可运行的case语句,且有default语句,那么就会执行default的动作。
- 如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行
例如:
package mainimport "fmt"func main() { var c1, c2, c3 chan int var i1, i2 int select { case i1 =
典型用法
1.超时判断
//比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行var resChan = make(chan int)// do requestfunc test() { select { case data :=
2.退出
//主线程(协程)中如下:var shouldQuit=make(chan struct{})fun main(){ { //loop } //...out of the loop select { case
3.判断channel是否阻塞
//在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断ch := make (chan int, 5)//...data:=0select {case ch