定时器补充
优质
小牛编辑
151浏览
2023-12-01
一次性定时器
NewTimer 函数
- func NewTimer(d Duration) *Timer
- NewTimer 创建一个 Timer,它会在到期后向 Timer 自身的 C 字段发送当时的时间
type Timer struct { C <-chan Time // 对于我们来说, 这个属性是只读的管道 r runtimeTimer }
package main import ( "fmt" "time" ) func main() { start := time.Now() fmt.Println("开始时间", start) timer := time.NewTimer(time.Second * 3) fmt.Println("读取之前代码被执行") end := <-timer.C // 系统写入数据之前会阻塞 fmt.Println("读取之后代码被执行") fmt.Println("结束时间", end) }
After 函数
- func After(d Duration) <-chan Time
- 底层就是对 NewTimer 的封装,只不过返回值不同而已
func After(d Duration) <-chan Time { return NewTimer(d).C }
package main import ( "fmt" "time" ) func main() { start := time.Now() fmt.Println("开始时间", start) timer := time.After(time.Second * 3) fmt.Println("读取之前代码被执行") end := <-timer // 系统写入数据之前会阻塞 fmt.Println("读取之后代码被执行") fmt.Println("结束时间", end) }
周期性定时器
NewTicker 函数
- func NewTicker(d Duration) *Ticker
- 和 NewTimer 差不多,只不过 NewTimer 只会往管道中写入一次数据,而 NewTicker 每隔一段时间就会写一次
type Ticker struct { C <-chan Time // 周期性传递时间信息的通道 // 内含隐藏或非导出字段 }
package main import ( "fmt" "time" ) func main() { // 1.创建一个周期定时器 ticker := time.NewTicker(time.Second) // 2.不断从重启定时器中获取时间 for{ t := <-ticker.C // 系统写入数据之前会阻塞 fmt.Println(t) } }