Таймеры и тикеры
Планируйте и повторяйте работу
«Таймеры и тикеры» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Время и длительность
- Форматирование и разбор
- Таймеры и тикеры
- Часовые пояса