代码中存在一个问题,即定时器 cycleTimer 每次循环都会被重置,导致无法按照预期的间隔触发。可以通过将定时器移至 for 循环外来解决这个问题。
以下是修复后的代码:
func main() {
timer(context.TODO())
}
func timer(ctx context.Context) {
interval := time.Microsecond * 10
//endTime := time.Now()
cnt := 10
startTime := time.Now()
for cnt > 0 {
cycleTimer := time.NewTicker(interval)
select {
case <-cycleTimer.C:
cnt--
case <-ctx.Done():
fmt.Println("ctx canceled")
cycleTimer.Stop()
return
}
cycleTimer.Stop()
}
fmt.Printf("use time.Tick delay %d us, real delay %v us\n",
interval.Nanoseconds(), time.Now().Sub(startTime).Nanoseconds())
}
在每次循环开始前创建新的定时器,并在每次循环结束后停止定时器。同时,在 case <-ctx.Done() 中添加 return 来确保函数及时退出。
内容由零声教学AI助手提供,问题来源于学员提问




