如果你从其它语言而来,要实现固定时间重复执行,第一个想到的代码可能是
for { time.Sleep(2 * time.Second) // 2 秒间隔 do_some_thing() }
但是,更优雅的方案其实是
for range time.Tick(2 * time.Second ) { do_some_thing() }
time.Tick() 函数返回的是一个 channel ,每隔指定的时间就会有数据从 channel 中出来。
range 其实是可以不接收遍历的值的,如果不接收,就可以简写成上面的格式。
那为什么我们不推荐 time.Sleep() 的方式呢,毕竟从上面的例子上看,感觉也没差多少啊?
但是,如果我们要指定退出机制,用 time.Sleep() 可能的做法就是
stop := false go func(){ for { if !stop { break; } do_some_thing() time.Sleep(2 * time.Second) // 2 秒间隔 } }() do_some_other_thing() stop = false
而用 time.Tick() 的做法则是
t: = time.NewTicker(time.Second * 2) go func(){ for { select { case <- t.C: do_some_thing() } } }() do_some_other_thing() t.Stop()
从逻辑和语义上来将 time.NewTicker() 的方式显然更 go
目前尚无回复