0Pricing
Go Academy · Урок

Таймеры и тикеры

Планируйте и повторяйте работу

«Таймеры и тикеры» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Приостановка с помощью Sleep

Самый простой инструмент планирования — time.Sleep(d): он приостанавливает текущую горутину на заданный промежуток времени.

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("start")
    time.Sleep(10 * time.Millisecond)
    fmt.Println("done")
}

Что такое таймер

time.Timer срабатывает один раз после задержки. По истечении задержки он отправляет текущее время в свой канал C.

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.NewTimer(10 * time.Millisecond)
    <-t.C
    fmt.Println("timer fired")
}

Сокращённая запись с time.After

time.After(d) возвращает канал, который выдаёт одно значение после задержки. Это удобный одноразовый таймер, для которого не нужна переменная.

package main

import (
    "fmt"
    "time"
)

func main() {
    <-time.After(10 * time.Millisecond)
    fmt.Println("elapsed")
}

Остановка таймера

timer.Stop() отменяет таймер до его срабатывания. Метод возвращает true, если таймер удалось вовремя остановить.

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.NewTimer(time.Hour)
    stopped := t.Stop()
    fmt.Println("stopped:", stopped)
}

Что такое тикер

time.Ticker срабатывает повторно через фиксированные интервалы и каждый раз отправляет значение в свой канал C.

Используйте его для периодических задач, например для опроса или отрисовки кадров анимации.

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    <-ticker.C
    fmt.Println("tick")
    ticker.Stop()
}

Подсчёт срабатываний

Перебирайте значения в канале тикера, выполняя действие на каждом интервале, а затем остановите тикер после нужного количества срабатываний.

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    for i := 1; i <= 3; i++ {
        <-ticker.C
        fmt.Println("tick", i)
    }
    ticker.Stop()
}

Всегда останавливайте тикер

В отличие от таймера, тикер продолжает работать, пока вы не вызовете Stop(). Если забыть его остановить, ресурсы будут утекать.

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    defer ticker.Stop()
    <-ticker.C
    fmt.Println("one tick, will stop on return")
}

Удобство time.Tick

time.Tick(d) напрямую возвращает канал тикера. Это простой вариант, но остановить его нельзя, поэтому используйте его только на протяжении всего времени работы программы.

package main

import (
    "fmt"
    "time"
)

func main() {
    c := time.Tick(5 * time.Millisecond)
    <-c
    fmt.Println("ticked")
}

Ограничение времени ожидания с помощью select

Объедините канал рабочей задачи с time.After в конструкции select, чтобы реализовать ограничение времени ожидания.

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    go func() { done <- true }()
    select {
    case <-done:
        fmt.Println("work finished")
    case <-time.After(time.Second):
        fmt.Println("timed out")
    }
}

AfterFunc запускает функцию обратного вызова

time.AfterFunc(d, f) запускает функцию f в собственной горутине после задержки, поэтому читать канал не требуется.

package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    time.AfterFunc(10*time.Millisecond, func() {
        fmt.Println("callback ran")
        done <- true
    })
    <-done
}

Таймер и тикер

Выбирайте вариант в зависимости от необходимости повторения:

  • Таймер: срабатывает один раз после задержки.
  • Тикер: срабатывает снова и снова через заданный интервал.
  • После завершения останавливайте оба, чтобы освободить ресурсы.
package main

import (
    "fmt"
    "time"
)

func main() {
    <-time.After(5 * time.Millisecond)
    fmt.Println("one-shot complete")
}

Быстрая проверка

Какой тип срабатывает повторно через фиксированный интервал?

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

Вы научились планировать выполнение задач:

  • Sleep приостанавливает выполнение, а Timer и time.After срабатывают один раз.
  • Ticker и time.Tick срабатывают повторно.
  • Используйте Stop() для освобождения ресурсов, а для ограничения времени ожидания объединяйте его с select.
package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Millisecond)
    defer ticker.Stop()
    for i := 0; i < 2; i++ {
        <-ticker.C
        fmt.Println("beat")
    }
}

Часто задаваемые вопросы

Урок «Таймеры и тикеры» бесплатный?

Да — полный текст урока «Таймеры и тикеры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Таймеры и тикеры»?

Планируйте и повторяйте работу Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Таймеры и тикеры»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Время и длительность
  2. Форматирование и разбор
  3. Таймеры и тикеры
  4. Часовые пояса
← Назад к Go Academy