Go Em Exemplos: Timers

As vezes, é necessário executar código em algum momento futuro, ou repetidamente com algum intervalo. Go conta com as ferramentas nativas timer e ticker. Ambos os recursos tornam a tarefa fácil. Primeiro será apresentado o recurso timer e posteriormente o ticker.

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

Timers representam um único evento no futuro. Ao timer é informado quanto tempo se pretende esperar e o recurso providencia um canal que será notificado ao esgotar o tempo estipulado. Este timer irá aguardar 2 segundos.

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

O <-timer1.C bloqueia no canal C de Timer até que envie um valor indicando que o tempo foi atingido.

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

Se a intenção for apenas aguardar, é possível utilizar time.Sleep. Uma razão para o timer ser útil é que ele pode ser cancelado antes o tempo esgotar. Aqui está um exemplo.

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

Ao dar tempo suficiente para o timer2 ser disparado, é fácil concluir que ele foi, de fato, parado, pois não disparou.

    time.Sleep(2 * time.Second)
}

O primeiro timer será disparado aproximadamente 2 segundos após a execução do código. Mas o segundo deve parar antes de ter a chance de disparar.

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

Próximo exemplo: Tickers.