time.Ticker шлёт значение в канал с заданным интервалом. Используется для периодических задач: пуллинг, heartbeat, сбор метрик.
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
fmt.Println("tick")
case <-ctx.Done():
return
}
}
Важно: всегда вызывай ticker.Stop(), иначе утечка ресурсов — таймер продолжит тикать, даже если канал никто не читает. В отличие от time.Timer (одноразовый), Ticker повторяется. Если обработка тика дольше интервала, тики не накапливаются — Ticker подстраивает следующий тик. Для простых случаев есть time.Tick(), но он не возвращает способ остановки, поэтому подходит только для вечных циклов.