Все самое полезное для Go-разработчика в одном канале.
Учиться у нас: clc.to/qaSdww
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0
Заявка: 8137752389
Post #7191
2.71K
⏰ Пакет time в Go: таймеры, тикеры и паттерны
Стандартный
Таймеры
Таймер можно остановить до срабатывания через
Тикеры
Таймауты через context
В продакшене таймауты реализуют через
Замер времени выполнения
Простая обёртка через
Rate limiter
Простейший вариант на
Retry с экспоненциальным backoff
Пауза удваивается после каждой неудачи, но не превышает
Если переходите с других языков — запомните референсную дату
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
Стандартный
time закрывает почти все задачи по работе со временем без сторонних библиотек. Разберём основные примитивы и паттерны.Таймеры
time.NewTimer() срабатывает один раз через заданный интервал:timer := time.NewTimer(2 * time.Second)
<-timer.C
fmt.Println("Timer fired!")
Таймер можно остановить до срабатывания через
timer.Stop() и перезапустить через timer.Reset().time.After() — сокращение без доступа к таймеру. time.AfterFunc() вызывает функцию в отдельной горутине.Тикеры
time.NewTicker() срабатывает повторно через равные интервалы. Всегда вызывайте Stop(), иначе горутина утечёт:ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for i := 0; i < 5; i++ {
<-ticker.C
fmt.Println("Tick", i)
}
Таймауты через context
В продакшене таймауты реализуют через
context — это позволяет пробросить отмену по всей цепочке вызовов:ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
select {
case result := <-doWork(ctx):
fmt.Println("Result:", result)
case <-ctx.Done():
fmt.Println("Timeout:", ctx.Err())
}
Замер времени выполнения
Простая обёртка через
defer. Первый вызов запоминает старт, возвращённое замыкание откладывается и печатает разницу:func measureTime(name string) func() {
start := time.Now()
return func() {
fmt.Printf("%s took %v\n", name, time.Since(start))
}
}
defer measureTime("main")()Rate limiter
Простейший вариант на
time.Tick() — один запрос в секунду:limiter := time.Tick(time.Second)
for req := range requests {
<-limiter
process(req)
}
Retry с экспоненциальным backoff
Пауза удваивается после каждой неудачи, но не превышает
maxBackoff. В продакшене стоит добавить jitter, чтобы клиенты не нагружали сервер одновременно:backoff := 100 * time.Millisecond
maxBackoff := 10 * time.Second
for i := 0; i < maxRetries; i++ {
if err := fn(); err == nil {
return nil
}
time.Sleep(backoff)
backoff *= 2
if backoff > maxBackoff {
backoff = maxBackoff
}
}
Если переходите с других языков — запомните референсную дату
1/2 3:4:5 2006 и не забывайте вызывать ticker.Stop().📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
- ❤ 7
- 👾 1










