定时器补充

优质
小牛编辑
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)
	}
}