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](tickers).
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