Стандартный
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