go select case的一个小坑
业务背景
之前在写很多if else时,对于不符合的分支条件总是习惯提前返回,减少对后面分支的心智负担,
最近在写1个go项目时,对于比较少使用go,在for select结构里遇到错误返回,导致直接返回了,后续tick就无效了
代码抽离简化如下
func Consumer() {
tick := time.NewTicker(time.Duration(1000) * time.Millisecond)
defer tick.Stop()
n := 0
for {
select {
case <-tick.C:
msg := fmt.Sprintf("ticked:%s,n=%d", gtime.Now().String(), n)
fmt.Println(msg)
time.Sleep(2 * time.Second)
n++
//这里模拟出错,
if n == 3 {
fmt.Println(n)
return
}
//后续处理
//很多代码
}
}
fmt.Println("end")
}
func TestConsume(t *testing.T) {
go Consumer()
time.Sleep(20 * time.Second)
}
代码执行到return 后,整个就返回了,后续的tick再也不起作用了,导致我的gqueue不能正常消费
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~