go select case的一个小坑

业务背景

image

之前在写很多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不能正常消费

posted @   H&K  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示