go select case的一個小坑

H&K發表於2024-08-03

業務背景

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不能正常消費

相關文章