如果你从其它语言而来,要实现固定时间重复执行,第一个想到的代码可能是
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
目前尚无回复