Go 并发代码中,经常需要让同一个 goroutine 在不同阶段监听不同事件:任务未启动时不接收数据,队列为空时不向下游发送,某个输入关闭并排空后不再关注它。
最直接的做法是为每种状态编写一套 select,但分支一多,代码很快变成重复的状态判断。Go 其实提供了一个简洁的控制手段:在进入下一轮 select 前把某个 channel 变量设为 nil,就能让对应的 case 暂时失效;恢复为有效 channel,分支又会在后续求值时重新启用。
这个技巧没有特殊语法,完全建立在 channel 的基本语义之上,却很适合实现状态机、多路合并与背压控制。