Тип time.Ticker
Тип Ticker представляет собой таймер, который генерирует события через регулярные промежутки времени. Он используется для выполнения действий с фиксированной периодичностью. Основное поле Ticker — это канал C, в который отправляется текущее время каждый раз, когда срабатывает тик. Для создания тикера используется функция NewTicker, которая принимает интервал между тиками в виде значения типа time.Duration.
Синтаксис
ticker := time.NewTicker(duration)
Где duration — интервал времени между тиками.
Создание и использование Ticker
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
for i := 0; i < 3; i++ {
t := <-ticker.C
fmt.Println("Tick at:", t)
}
}
Результат выполнения кода:
"Tick at: 2026-09-04 12:00:00 +0000 UTC"
"Tick at: 2026-09-04 12:00:02 +0000 UTC"
"Tick at: 2026-09-04 12:00:04 +0000 UTC"
В этом примере тикер отправляет значение в канал каждые 2 секунды. Цикл получает три тика и выводит время каждого из них.
Остановка Ticker с помощью Stop
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(1 * time.Second)
go func() {
time.Sleep(3 * time.Second)
ticker.Stop()
fmt.Println("Ticker stopped")
}()
for t := range ticker.C {
fmt.Println("Tick at:", t)
}
}
Результат выполнения кода:
"Tick at: 2026-09-04 12:00:01 +0000 UTC"
"Tick at: 2026-09-04 12:00:02 +0000 UTC"
"Tick at: 2026-09-04 12:00:03 +0000 UTC"
"Ticker stopped"
Метод Stop останавливает тикер, после чего канал C больше не получает значений. Это позволяет корректно завершить работу с тикером и избежать утечек ресурсов.
Сброс интервала с помощью Reset
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
time.Sleep(1 * time.Second)
ticker.Reset(500 * time.Millisecond)
for i := 0; i < 3; i++ {
t := <-ticker.C
fmt.Println("Tick at:", t)
}
}
Результат выполнения кода:
"Tick at: 2026-09-04 12:00:01.500 +0000 UTC"
"Tick at: 2026-09-04 12:00:02.000 +0000 UTC"
"Tick at: 2026-09-04 12:00:02.500 +0000 UTC"
Метод Reset изменяет интервал между тиками. В примере после создания тикера с интервалом 2 секунды, через 1 секунду интервал сбрасывается на 500 миллисекунд, и последующие тики происходят с новым интервалом.
Использование Ticker в фоновых задачах
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(3 * time.Second)
defer ticker.Stop()
done := make(chan bool)
go func() {
for {
select {
case t := <-ticker.C:
fmt.Println("Background task at:", t)
case <-done:
fmt.Println("Stopping background task")
return
}
}
}()
time.Sleep(10 * time.Second)
done <- true
time.Sleep(1 * time.Second)
}
Результат выполнения кода:
"Background task at: 2026-09-04 12:00:03 +0000 UTC"
"Background task at: 2026-09-04 12:00:06 +0000 UTC"
"Background task at: 2026-09-04 12:00:09 +0000 UTC"
"Stopping background task"
В этом примере тикер используется в фоновой горутине для выполнения задач с фиксированной периодичностью. Управление остановкой происходит через канал done.
Смотрите также
-
тип
time.Timer,
который представляет однократный таймер -
функцию
time.NewTicker,
которая создает новый тикер -
функцию
time.Tick,
которая возвращает канал для простых случаев -
тип
time.Duration,
который используется для задания интервалов времени