package main
import (
"fmt"
"sync"
"testing"
"time"
)
// 1.定时器 time.Timer
func TestTimer(t *testing.T) {
//1. 创建一个定时器对象, 指定特定时间到期
timer := time.NewTimer(1 * time.Second)
//2. 定时器到期后,定时器会向内部的C channel发送一条类型为time.Time的消息
expire := <-timer.C
fmt.Println(expire.Format(time.DateTime))
//或者使用time.AfterFunc函数在指定时间不是向内部通道发送消息而是指定执行任务
time.AfterFunc(1*time.Second, func() {
fmt.Println("task running")
})
time.Sleep(3 * time.Second)
//time.After 底层使用NewTimer函数并返回C字段(只读通道),为我们屏蔽了timer类的实现
var after <-chan time.Time = time.After(10 * time.Second)
arrive := <-after
fmt.Println(arrive)
}
func TestTimerReset(t *testing.T) {
timer := time.NewTimer(10 * time.Second)
//定时器可以复用,Reset方法进行重置
timer.Reset(3 * time.Second)
expire := <-timer.C
fmt.Printf("end:%s\n", expire.Format(time.DateTime))
}
// 2.续断器 time.Ticker
func TestTicker(t *testing.T) {
//1. 创建一个Ticker对象,指定间断时间为3s,续断器每3s会向内部的C通道发送一条消息,如果发送消息时上一条消息还没有被消费,则这条消息会被抛弃
ticker := time.NewTicker(3 * time.Second)
var wg sync.WaitGroup
wg.Add(1)
go func() {
for t := range ticker.C {
fmt.Println(t)
}
}()
wg.Wait()
}
[Golang]time与channel
于 2023-12-09 00:24:47 首次发布