定时器在日常开发中使用非常广泛,设置心跳,周期计算等都需要定时器。主要通过time ticker实现。
type Ticker //主要用来按照指定的时间周期来调用函数或者计算表达式,通常的使用方式是利用go新开一个协程使用,它是一个定时器。
func NewTicker(d Duration) *Ticker //新生成一个ticker,此Ticker包含一个channel,此channel以给定的duration发送时间。
func (t *Ticker) Stop() //用于关闭相应的Ticker,但并不关闭channel。
Ticker中的C为数据类型为Time的单向管道,只能读,不能写。
使用方式:
func timer() {
timer := time.NewTicker(1 * time.Second)
for {
select {
case <-timer.C:
xxx() //执行我们想要的操作
}
}
}
注意:time.C(放时间的channel通道)(注:Time.C:=make(chan time.Time))
使用时间控制停止ticker:
func main() {
ticker := time.NewTicker(time.Millisecond * 500)
go func() {
for t := range ticker.C {
fmt.Println(“Tick at”, t)
}
}()
time.Sleep(time.Millisecond * 1500) //阻塞,则执行次数为sleep的休眠时间/ticker的时间
ticker.Stop()
fmt.Println(“Ticker stopped”)
}
结果:
Tick at 2018-03-17 21:53:11.3355576 +0800 CST m=+0.500201001
Tick at 2018-03-17 21:53:11.8397587 +0800 CST m=+1.004402101
Ticker stopped
使用channel控制停止ticker:
ticker := time.NewTicker(time.Millisecond * 500)
c := make(chan int,num) //num为指定的执行次数
go func() {
for t := range ticker.C {
c<-1
fmt.Println(“Tick at”, t)
}
}()
ticker.Stop()
这种情况下,在执行num次以Ticker时间为单位的函数之后,c channel中已满,以后便不会再执行对应的函数.
范例:
import(
“fmt”
“time”
)
func main() {
ticker := time.NewTicker(10 * time.Second)
for i := 0; i < 10; i++ {
time := <-ticker.C //把信道中的时间按照约定的周期传入
fmt.Println(time.String())
}
}
结果:
2018-03-17 21:43:34.9435209 +0800 CST m=+10.001617701
2018-03-17 21:43:44.9451385 +0800 CST m=+20.003235301
2018-03-17 21:43:54.9457562 +0800 CST m=+30.003853001
2018-03-17 21:44:04.9463738 +0800 CST m=+40.004470601
2018-03-17 21:44:14.9469914 +0800 CST m=+50.005088201
……