Go в примерах: Таймеры (Timers)

Часто мы хотим выполнить код Go в какой-то момент в будущем или повторно через определенный промежуток времени. Встроенные функции таймера и тикера Go облегчают обе эти задачи. Сначала мы рассмотрим таймеры, а затем тикеры.

package main
import (
    "fmt"
    "time"
)
func main() {

Таймеры позволяет выполнить одно событие в будущем. Вы сообщаете таймеру, как долго вы хотите ждать, и он предоставляет канал, который будет уведомлен в это время. Этот таймер будет ждать 2 секунды.

    timer1 := time.NewTimer(2 * time.Second)

<-timer1.C блокирует канал таймера C пока не будет отправлено сообщение о том, что таймер истек

    <-timer1.C
    fmt.Println("Timer 1 expired")

Если бы вы просто хотели подождать, вы могли бы использовать time.Sleep. Одна из причин, по которой таймер может быть полезен, заключается в том, что вы можете отменить таймер до его истечения, как в этом примере.

    timer2 := time.NewTimer(time.Second)
    go func() {
        <-timer2.C
        fmt.Println("Timer 2 expired")
    }()
    stop2 := timer2.Stop()
    if stop2 {
        fmt.Println("Timer 2 stopped")
    }
}

Первый таймер истекает через ~2с после запуска программы, но второй должен быть остановлен до того, как он истечет.

$ go run timers.go
Timer 1 expired
Timer 2 stopped

Следующий пример: Тикеры (повторения) (Tickers).