定时器打点器
567字约2分钟
2025-02-03
定时器
我们经常需要在未来的某个时间点运行 Go 代码,或者每隔一定时间重复运行代码。 Go 内置的 定时器 和 打点器 特性让这些变得很简单。
package main
import (
    "fmt"
    "time"
)
func main() {
    // 创建一个定时器,设置定时器触发时间为2秒后
    timer1 := time.NewTimer(2 * time.Second)
    // 手动阻塞主线程,等待定时器触发
    fmt.Println("等待定时器1触发...")
    // 通过 <-timer.C 从定时器的通道中接收数据,这将导致主线程阻塞,
    // 直到定时器触发或者定时器被停止
    <-timer1.C
    // 定时器触发后打印出相应的信息
    fmt.Println("定时器1触发了")
    // 手动停止定时器
    timer1.Stop()
    // 打印出定时器停止的信息
    fmt.Println("定时器1已停止")
    timer2 := time.NewTimer(time.Second)
    go func() {
        <-timer2.C
        fmt.Println("定时器2触发了")
    }()
    // 如果你需要的仅仅是单纯的等待,使用 time.Sleep 就够了。 
    // 使用定时器的原因之一就是,你可以在定时器触发之前将其取消。
    stop := timer2.Stop()
    if stop {
        fmt.Println("定时器2已停止")
    }
    time.Sleep(2 * time.Second)
    // 主函数继续执行其他操作
    fmt.Println("主函数继续执行...")
}打点器
定时器是当你想要在未来某一刻执行一次时使用的。而打点器 则是为你想要以固定的时间间隔重复执行而准备的。 这里是一个打点器的例子,它将定时的执行,直到我们将它停止。
package main
import (
    "fmt"
    "time"
)
func main() {
    // 创建一个定时器,设置定时器的间隔为1秒
    ticker := time.NewTicker(1 * time.Second)
    // 启动一个匿名函数作为协程,用于处理定时器触发的事件
    go func() {
        // 循环遍历定时器的通道
        for {
            select {
            case t := <-ticker.C: // 定时器触发时
                fmt.Printf("%v | 定时器触发了\n", t)
            }
        }
    }()
    // 主函数继续执行其他操作
    fmt.Println("主函数继续执行...")
    // 等待10秒后停止定时器
    time.Sleep(10 * time.Second)
    ticker.Stop()
    // 打印出定时器停止的信息
    fmt.Println("定时器已停止")
    // 主函数继续执行其他操作
    fmt.Println("主函数继续执行...")
}