在线文档  >   Golang练习   >   定时器-Ticker

在Go中,计时器timer用于在将来某个时刻执行一次任务,而定期任务则使用 ticker 。以下是一个ticker的示例,它会定期执行,直到我们停止它。

package main

import (
    "fmt"
    "time"
)

func main() {

    // Ticker使用与计时器类似的机制:通过一个channel来发送值。
    // 这里我们将使用`select`内置函数在通道上等待,以便在每500ms时接收到发送的值。
    ticker := time.NewTicker(500 * time.Millisecond)
    done := make(chan bool)

    go func() {
        for {
            select {
            // done channel 用于接收外部传递的停止信号
            case <-done:
                return
            // ticker.C的值则是定期发送的时间戳
            case t := <-ticker.C:
                fmt.Println("Tick at", t)
            }
        }
    }()

    // Tickers可以像计时器一样停止。
    // 一旦停止了,ticker就不会再收到来自其通道的任何值。我们将在1600ms之后停止它。
    time.Sleep(1600 * time.Millisecond)
    ticker.Stop()
    done <- true
    fmt.Println("Ticker stopped")
}

运行结果如下:

$ go run tickers.go
Tick at 2012-09-23 11:29:56.487625 -0700 PDT
Tick at 2012-09-23 11:29:56.988063 -0700 PDT
Tick at 2012-09-23 11:29:57.488076 -0700 PDT
Ticker stopped

当我们运行此程序时,定时器会在我们停止它前运行 3 次。