Go语言select语句如何按条件启用case实现可选超时退出功能
优雅实现方案
核心思路是利用Go语言select语句会忽略nil通道的特性,仅用一个select块即可替代两层嵌套的分支逻辑,代码更简洁无冗余。
实现代码
var t time.Duration // 你的超时时长变量 aChan := make(chan struct{}) timeoutChan := make(chan struct{}) // 你原逻辑中的超时通知通道 // 初始化超时通道:非正超时时长时保持为nil var timeout <-chan time.Time if t > 0 { timeout = time.After(t) } select { case <-timeout: fmt.Fprintln(os.Stdout, "timeout!") close(timeoutChan) case <-aChan: fmt.Fprintln(os.Stdout, "aChan is closed") return }
原理解释
- 当
t为正时长时,timeout是正常的计时通道,select会同时监听timeout超时信号和aChan关闭信号,任意一个触发就执行对应分支 - 当
t为非正时长时,timeout保持为nil值,select会自动忽略nil通道对应的case,等价于仅监听aChan,完全匹配需求逻辑
另外你贴出的原代码中fmt.Fprintln调用多写了一个多余的右括号,实际运行时需要修正。
内容的提问来源于stack exchange,提问作者Ugty
相关产品推荐
相关产品推荐

