time.NewTimer 只会响应一次:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建一个定时器,设置时间为2s,时间到了之后往time通道写内容,内容为当前时间
	timer := time.NewTimer(2 * time.Second)

	fmt.Println("当前时间 :", time.Now())
	t := <-timer.C // 两秒后就会往通道里写入时间
	fmt.Println("定时器时间:", t)
}

延时功能:

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.NewTimer(2 * time.Second)
	<-timer.C // 时间到了之后阻塞
	fmt.Println("时间到了")

	time.Sleep(2 * time.Second)
	fmt.Println("时间到了")

	<-time.After(2 * time.Second) // 阻塞两秒后往channel写内容
	fmt.Println("时间到了")
}

定时器关闭:

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.NewTimer(3 * time.Second) // 3s后往timer通道中写时间

	go func() {
		num := <-timer.C // 未读出内容时一直保持死锁
		fmt.Println("时间到了", num)
	}()
	// 因为主协程和子协程是同时执行的,定时器被关闭后就不会执行了
	timer.Stop()
	for {
	}
}

时间重置:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now())
	timer := time.NewTimer(3 * time.Second)
	timer.Reset(time.Second) // 将时间重置为一秒
	t := <-timer.C
	fmt.Println(t)
}

循环事件ticker:

package main

import (
	"fmt"
	"time"
)

func main() {
	ticker := time.NewTicker(time.Second) // 实现循环事件

	for {
		t := <-ticker.C // 每隔一秒就往管道里输入
		fmt.Println(t)
	}
}