Функция time.NewTicker

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

Синтаксис

gotime.NewTicker(d)

Базовый пример

Давайте создадим тикер с интервалом 500 миллисекунд и выведем время в канал три раза:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  ticker := time.NewTicker(500 * time.Millisecond)
  defer ticker.Stop()

  for i := 0; i < 3; i++ {
    t := <-ticker.C
    fmt.Println(t)
  }
}

Результат выполнения кода (примерный вывод):

go"2026-09-04 12:00:00.500 +0300 MSK m=+0.500..."
"2026-09-04 12:00:01.000 +0300 MSK m=+1.000..."
"2026-09-04 12:00:01.500 +0300 MSK m=+1.500..."

Пример с остановкой тикера

Тикер можно остановить методом Stop, чтобы прекратить отправку значений в канал. Это важно для предотвращения утечек горутин:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  ticker := time.NewTicker(300 * time.Millisecond)

  go func() {
    for t := range ticker.C {
      fmt.Println(t)
    }
  }()

  time.Sleep(1 * time.Second)
  ticker.Stop()
  fmt.Println("Ticker stopped")
}

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

go"2026-09-04 12:00:00.300 +0300 MSK m=+0.300..."
"2026-09-04 12:00:00.600 +0300 MSK m=+0.600..."
"2026-09-04 12:00:00.900 +0300 MSK m=+0.900..."
"Ticker stopped"

Пример использования в реальной задаче

Давайте смоделируем выполнение фоновой задачи каждую секунду с возможностью остановки:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  ticker := time.NewTicker(1 * time.Second)
  done := make(chan bool)

  go func() {
    for {
      select {
      case <-done:
        return
      case t := <-ticker.C:
        fmt.Printf("Task executed at %s\n", t)
      }
    }
  }()

  time.Sleep(3 * time.Second)
  done <- true
  ticker.Stop()
  fmt.Println("Main done")
}

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

go"Task executed at 2026-09-04 12:00:01 +0300 MSK"
"Task executed at 2026-09-04 12:00:02 +0300 MSK"
"Task executed at 2026-09-04 12:00:03 +0300 MSK"
"Main done"

Смотрите также

  • функцию time.NewTimer,
    которая создает таймер для однократного события
  • метод time.Ticker.Stop,
    который останавливает тикер
  • метод time.Ticker.Reset,
    который изменяет интервал тикера
  • функцию time.Tick,
    которая возвращает канал для простых случаев