Timer 是一个定时器,代表未来的一个单一事件,你可以告诉 timer 你要等待多长时间,它 提供一个 channel,在将来的那个时间那个 channel 提供了一个时间值。

Timer

创建方法
  1. <font style="color:rgb(0,0,0);">timer := time.NewTimer(...)</font>
  2. <font style="color:rgb(0,0,0);">time.After(...)</font>

time.NewTimer(…)

基本执行语法

  1. 语法:
    1. 设置时间<font style="color:rgb(0,0,0);">timer := time.NewTimer(time.Second*n)</font>
    2. 执行 <font style="color:rgb(0,0,0);"><-timer.C</font>
  2. 目的:实现一个等待,且返回实时时间
    定时器 - 图1
    结果:
    定时器 - 图2
  3. 解释:
    变量timer包含一个管道C(channel的简写)
  4. NOTE:如果只是单纯等待,不返回实时时间
    1. 可以<font style="color:rgb(0,0,0);">time.Sleep(time.Second*3)</font>等待3秒
    2. 或者把上面改一下<font style="color:rgb(0,0,0);"><-timer.C</font>

停止定时器

  1. 语法:
    1. 设置<font style="color:rgb(0,0,0);">timer := time.NewTimer(time.Second*n)</font>
    2. 执行 <font style="color:rgb(0,0,0);"><-timer.C</font>
    3. 停止<font style="color:rgb(0,0,0);">timer.Stop()</font>
  2. 目的:停止之前设置的定时器
  3. 实例 1. 实例1
    定时器 - 图3 2. 实例3
    定时器 - 图4
    <font style="color:#E8323C;">timer.Stop()</font>执行了,执行成功还给true,执行不成功返回false

重置定时器

  1. 语法:
    1. <font style="color:rgb(0,0,0);">timer := time.NewTimer(time.Second*n)</font>
    2. 重置时间为m秒<font style="color:rgb(0,0,0);">timer.Reset(time.Second*m)</font>
    3. 执行<font style="color:rgb(0,0,0);"><-timer.C</font>
  2. 目的:之前设置过时间,可能代码太多,忘了在哪,现在重置一下再执行

time.After(…)用法

  1. 语法:<font style="color:rgb(0,0,0);"><- time.After(time.Second*n)</font>
    函数返回值就是chan Time,优点是比NewTimer更直接,无需赋予变量,缺点是没它那么多功能
  2. 目的,实现一个等待,并返回时间
  3. 实例
    定时器 - 图5
    结果:
    定时器 - 图6

总结

  1. 实现延时功能
    1. <font style="color:rgb(0,0,0);">timer := time.NewTimer(time.Second*n)</font> + <font style="color:rgb(0,0,0);"><-timer.C</font>可获得实时时间
    2. <font style="color:rgb(0,0,0);"><- time.After(time.Second*m)</font>可获得实时时间
    3. <font style="color:rgb(0,0,0);">time.Sleep(time.Second*3)</font>但不返回实时时间
  2. 功能性 1. 设置时间<font style="color:rgb(0,0,0);">timer := time.NewTimer(time.Second*n)</font>,执行<font style="color:rgb(0,0,0);"><-timer.C</font>,在此基础上 1. 可停止计时器<font style="color:rgb(0,0,0);">timer.Stop()</font> 2. 可重置计时器<font style="color:rgb(0,0,0);">timer.Reset(time.Second*m)</font> 2. <font style="color:rgb(0,0,0);"><- time.After(time.Second*m)</font>只能延时+返回实时时间

Ticker

Timer只执行一次,而Ticker可周期执行

语法

  1. 设置<font style="color:rgb(0,0,0);">ticker := time.NewTicker(time.Second*n)</font>
  2. 执行 <font style="color:rgb(0,0,0);"><- ticker.C</font>
  3. 要是想停止,可<font style="color:rgb(0,0,0);">ticker.Stop()</font>

应用

  1. 实例1
    定时器 - 图7
    结果
    定时器 - 图8
  2. 实例2——遍历
    1. for..range 是一个有周期的无限循环,记得必须有中断条件(或者这个中断条件是主线程结束)
    2. 可获得实时时间
      定时器 - 图9
    3. 不获得时间就这么写,注意不是:=
      定时器 - 图10
      结果
      定时器 - 图11
  3. 实例3,与select的结合,目的是用select随机发送数据,比如不间断随机发一些抽奖数字啊
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. //目的是用select批量发送数据
  7. func main() {
  8. ch1 := make(chan int)
  9. ticker := time.NewTicker(time.Second)
  10. go func() {
  11. for _=range ticker.C{
  12. select {
  13. case ch1<-1:
  14. case ch1<-2:
  15. case ch1<-3:
  16. }
  17. }
  18. }()
  19. sum:=0
  20. for v:= range ch1{
  21. fmt.Println("收到, v=",v)
  22. sum++
  23. if sum >=10{
  24. break
  25. }
  26. }
  27. }

定时器 - 图12