/*
go计时器
我们有的时候希望go 在未来的某个时刻执行或
者是以一定的时间间隔重复执行
go内置的timer和ticker功能使得这些任务变得简单了
*/
package main
import (
"fmt"
"time"
)
/*
知识点:
time.NewTimer()
<-timer1.C
timer1.Stop()
本质还是基于事件通知
*/
func main() {
/*
Timer 代表了未来的一个事件
你告诉timer需要等待多久 然后
计时器提供了一个通道 这个通道将在等待的时间结束后得到通知
这里的timer将等待2秒
*/
timer1 := time.NewTimer(time.Second * 2)
/*
这里的 <-timer1.C 在timer的通道C上面阻塞等待 直到有个值发送给该
通道 通知通道计时器已经等待完成
timer.NewTimer方法方法获取的timer1的结构定义为
type Ticket struct{
C <-chan Time
}
*/
<-timer1.C
fmt.Println("Timer 1 expired")
/*
如果你仅仅需要等待的话
你可以使用time.Sleep()
而timer的独特之外在于你可以在timer等待完成之前取消等待
*/
timer2 := time.NewTimer(time.Second)
go func() {
<-timer2.C
fmt.Println("Timer 2 expired")
}()
stop2 := timer2.Stop()
if stop2 {
fmt.Println("Timer 2 stopped")
}
}