go关键字之select

select是Go中的一个控制结构,相似于switch语句,用于处理异步IO操做。select会监听case语句中channel的读写操做,当case中channel读写操做为非阻塞状态(即能读写)时,将会触发相应的动做。
select中的case语句必须是一个channel操做

select中的default子句老是可运行的。

若是有多个case均可以运行,select会随机公平地选出一个执行,其余不会执行。 若是没有可运行的case语句,且有default语句,那么就会执行default的动做。 若是没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通讯能够运行

典型用法
1.超时判断

//好比在下面的场景中,使用全局resChan来接受response,若是时间超过3S,resChan中尚未数据返回,则第二条case将执行
var resChan = make(chan int)
// do request
func test() {
    select {
    case data := <-resChan:
        doData(data)
    case <-time.After(time.Second * 3):
        fmt.Println("request time out")
    }
}

func doData(data int) {
    //...
}

2.退出

//主线程(协程)中以下:
var shouldQuit=make(chan struct{})
fun main(){
    {
        //loop
    }
    //...out of the loop
    select {
        case <-c.shouldQuit:
            cleanUp()
            return
        default:
        }
    //...
}

//再另一个协程中,若是运行遇到非法操做或不可处理的错误,就向shouldQuit发送数据通知程序中止运行
close(shouldQuit)

3.判断channel是否阻塞

//在某些状况下是存在不但愿channel缓存满了的需求的,能够用以下方法判断
ch := make (chan int, 5)
//...
data:=0
select {
case ch <- data:
default:
    //作相应操做,好比丢弃data。视需求而定
}
--------------------- 

参考:https://blog.csdn.net/zhaominpro/article/details/77570290?utm_source=debugrun&utm_medium=referral

 

 

注:select主要进行channel状态的判断,本质是channel可否有数据读出,经过该判断进行一些有趣的应用。缓存

相关文章
相关标签/搜索