select和switch类似,不同的是case内容必须是接收io执行结果(例如<-channel),且不需要break。
具体执行逻辑如下:
- 如果除default之外,只有一个case满足,则执行case内容
- 如果除default之外有多个case满足,则伪随机执行一个case内容
- 如果default之外的case都不满足,则执行default内容
- 如果没有default,所有case都不满足,则阻塞直到有一个case条件满足
select与channel使用demo
1 | func main() { |
output:
1 | ========第1秒========= |
通过done channel退出goroutine
1 | func worker(done chan bool) { |
参考资料
Go语言并发模型:使用 select
https://segmentfault.com/a/1190000006815341
Go Channel 详解
https://colobu.com/2016/04/14/Golang-Channels/