在golang中我们可以通过使用 for select { case } 语句+ time.Ticker时间断续器 来创建一个在指定时间间隔循环执行的时间断续器。
time.Ticker时间断续器 和 time.Timer定时器 的区别
注意,我们在使用时需要分辨清除golang中的这2个对象。
- time.Ticker时间断续器(使用time.NewTicker函数创建)是每隔一段时间就执行一次,只要这个ticker不关闭就会一直执行下去;
- time.Timer定时器(使用time.NewTimer 函数创建)是在指定的时间之后执行一次就会被关闭。 golang中定时器我们一般使用
for select {case} 语句+ time.Ticker使用示例
以下示例创建一个时间断续器, 每隔1分钟执行一次 【每隔1分钟打印一次 hello world! 和当前时间】, go底层会在我们指定的时间间隔就将当前的时间放入到 ticker.C 通道中,下面示例中我们使用 ts来接收通道中的时间并将他打印了出来。
// 时间断续器 每隔1分钟执行一次
ticker := time.NewTicker(1 * time.Minute)
defer ticker.Stop() // 确保函数关闭时关闭这个断续器
done := make(chan bool, 1)
// for select 循环
for {
select {
case ts:=<-ticker.C: // 这个分支会每隔1分钟执行一次
fmt.Printf("hello world! now time is:%v", ts.Format(time.RFC3339))
case <-done: // 这个不会被执行,仅满足select语法 (多个case语句)
return
}
}
注意上面的select的第二个case分支,这个是不会被执行的,因为我们只是创建了这个通道,而没有向着通道写入任何的数据。 在这里的作用就只是为了满足select语句的语法而已.
time.Timer定时器使用示例
对于定时器,由于他只会在指定的时间之后执行一次,我们就使用select即可。
// 1分钟后执行的定时器
timer:=time.NewTimer(1 * time.Minute)
select{
case ts:=<-timer.C: // 在指定的时间之后会被执行一次
fmt.Printf("时间到了! %v\n",ts.Format(time.RFC3339))
timer.Stop()
case <-done: // 不会被执行
break
}