标准答案
- 多个接收或发送分支同时就绪时,select 不保证固定优先级。
- 没有 default 时会等待任一分支或 context 取消;适合事件循环和协作关闭。
- default 适合非阻塞探测,但循环需要 ticker、退避或阻塞分支避免忙等。
- 关闭 channel 会让接收分支持续就绪,应配合 ok 判断移除或结束。
题目解析
select 等待多个 channel 操作,多个分支同时就绪时并不按代码顺序保证优先级。没有 default 时可以阻塞并等待事件或 context 取消。
default 适合一次性非阻塞探测,放进紧循环会形成忙等并占满 CPU。需要轮询时要有 ticker、退避或其他让出点。
已关闭 channel 的接收会持续返回零值和 false,必须移除该分支或结束循环。业务优先级不能依靠 select 的偶然调度,应使用显式队列。
常见误区
- 误区:for + select + default 无限空转。改正:移除 default 或加入 ticker、退避和取消。
- 误区:忽略 closed channel。改正:检查 ok,关闭后禁用该分支或结束消费者。
- 误区:认为 select 分支按代码顺序执行。改正:并发就绪时不保证固定优先级,需要显式调度。