Select 有哪些注意事项?
Select 有哪些注意事项?
提示
题眼: 哪些操作会阻塞。
关于 select,需要注意以下几点:
- 如果没有
default分支,并且所有case当前都不能执行,那么程序会阻塞在select上。 - 如果有
default分支,那么即使所有case都不满足条件,select也不会阻塞,而是直接进入default。 - 一旦发现通道已经关闭,要及时处理退出逻辑,避免无意义循环。
select本身只会执行一次,实际开发里通常会配合for一起使用。- 在
for + select场景下,break只会跳出select,不会直接跳出外层for,通常要用标签、return或其他显式控制方式退出。 - 如果多个
case同时满足执行条件,运行时会伪随机选择一个执行,不是严格按从上到下依次命中。
重要
参考答案:
select 主要用于同时监听多个 Channel。它可以配合多个 case 一起使用,哪个通道先满足条件,就执行哪个分支;如果多个分支同时满足,运行时会伪随机选一个执行。
select 最大的特点就是它和 Channel 的阻塞语义结合得很紧。如果没有 default,所有 case 都暂时不能执行时,程序就会阻塞住;如果加了 default,就可以把它写成非阻塞逻辑。
另外要注意,select 语句本身只执行一次,所以实际开发中通常都会写成 for { select { ... } }。这种情况下,如果想退出循环,不能只在 select 里写普通的 break,因为它只能跳出当前的 select,一般更常见的是直接 return,或者用带标签的 break。
相关信息
引申: 读取通道都有哪些方法?什么是 IO 多路复用?如何实现非阻塞发送和接收?
