Go的标准包time里提供了两种定时器,一种是标准定时器,另一种是循环定时器。
timer在到达指定时间时仅仅触发一次,当timer到期时会将当前时间发送到自己的C管道,timer实例必须通过NewTimer或AfterFunc
timer := time.NewTimer(time.Second * 3)
延迟执行:
第一种实现
time.sleep(3 * time.Second)
使用After模拟超时:After到达指定时间后会向内置C管道发送当前时间
func TestMyTime() { c := make(chan struct{}) go func() { time.Sleep(3 * time.Second) <- c }() // select case可以是发送可以是接收 select { case c <- struct{}{}:fmt.Println("channel") case <- time.After(5 * time.Second):fmt.Println("超时啦") close(c) } }
第二种实现:使用AfterFunc,返回timer对象,可用来关闭定时器
func TestTimeAfterFunc() { c := make(chan struct{}) timer := time.AfterFunc(3 * time.Second, func() { fmt.Println("经过3秒后执行该函数") c <- struct{}{} }) <- c timer.Stop() }
time包中的循环定时器都是永久执行的定时器,直到手动关闭它。time中没有可以指定次数的循环定时器。会根据时间频率不断发送时间到返回的管道
func TestTick() { ticker := time.NewTicker(time.Second * 1) wg := sync.WaitGroup{} wg.Add(10) for t := range ticker.C { fmt.Printf("Backup at %s\n", t) wg.Done() } wg.Wait() }