go语言的select和poll有点类似,监听多个channel,当channel上可读时,执行对应的操作。
基本用法:
ch1 := make(chan bool)
ch2 := make(chan bool)
.....
for {
select {
case <-ch1:
case <-ch2:
default:
}
}
要注意的时,select和switch有点类似,但select的case后只能是IO操作。上述程序的执行过程是这样的,程序进入select后,如果没有case中的channel可读,则阻塞,直到有channel可读;如果仅有一个channel可读,则执行这个case;如果有多个channel可读,则随机公平地选出一个case执行,其他不会执行。
在写程序时一个非常典型的用法时用select实现超时机制,比如笔者最近在写的Raft协议就用到la,看代码:
timeout := make(channel bool)
go func(){
time.Sleep(1000 * time.Millisecond)
timeout <- true
}()
for {
select {
case <-ch:
case <-timeout:
}
}
有疑问加站长微信联系(非本文作者)