简述
select 是golang中处理并发编程中通信管道(channel)之间异步IO通信的一个控制结构,监听面向通信管道的IO操作,具有阻塞特性。 相似于switch语句,但是每个case后面并不像switch那般带判断条件,而仅仅只能是一个通信管道的操作。
特点
- select当中如果没有default的语句,则会阻塞直到监听的某个通信管道读或写的操作成功为止
- select当中的case是非阻塞的并发执行的,会优先选择通信管道操作成功的case去执行,如果存在同时返回,则会进行随机选择其一去执行,此时将无法保证执行顺序
- select当中的case语句中,当存在通信管道值为nil的读或者写操作时,则该分支将被忽略,可理解成select中删除了这个case
- select当中若存在超时条件语句,则在当前时间段内已知没有满足的case,便会执行这个超时的case,否则便执行出现了的可操作的case,一般情况下是用超时语句代替default语句
- 空select,如select{},会引起死锁,一般情况下我们可用空的select{}来阻塞main goroutine
- 对于for的select{},也有可能会引起cpu占用过高的问题