Тип time.Ticker

Тип Ticker представляет собой таймер, который генерирует события через регулярные промежутки времени. Он используется для выполнения действий с фиксированной периодичностью. Основное поле Ticker — это канал C, в который отправляется текущее время каждый раз, когда срабатывает тик. Для создания тикера используется функция NewTicker, которая принимает интервал между тиками в виде значения типа time.Duration.

Синтаксис

goticker := time.NewTicker(duration)

Где duration — интервал времени между тиками.

Создание и использование Ticker

gopackage 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)
  }
}

Результат выполнения кода:

go"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

gopackage 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)
  }
}

Результат выполнения кода:

go"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

gopackage 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)
  }
}

Результат выполнения кода:

go"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 в фоновых задачах

gopackage 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)
}

Результат выполнения кода:

go"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,
    который используется для задания интервалов времени