time

Тема дорожной карты · Golang

Пакет time — стандартная библиотека Go для измерения, представления и манипулирования временными значениями, предоставляющая time.Time, time.Duration, time.Ticker, time.Timer и форматирование на основе шаблона, используемое каждым Golang-бэкенд-сервисом. time.Now() возвращает текущее локальное время как значение time.Time, time.Since(t) измеряет прошедшую длительность, а time.Until(t) вычисляет оставшееся время — все возвращают time.Duration в наносекундах с константами time.Second, time.Millisecond и time.Minute. time.AfterFunc, time.NewTicker и time.NewTimer пакета time естественно интегрируются с goroutines и оператором select для планирования работы, реализации экспоненциальной задержки повторных попыток и соблюдения дедлайнов совместно с context.WithTimeout и context.WithDeadline. Парсинг и форматирование используют строку шаблона reference-time ("2006-01-02T15:04:05Z07:00") вместо strftime-кодов — это уникально для Go и распространённый источник путаницы для разработчиков, только начинающих работать с Golang, — но гарантирует, что сам шаблон является корректным примером формата. Корректное использование пакета time, включая работу с часовыми поясами через time.LoadLocation и монотонные показания часов, необходимо для создания надёжных функций планирования, TTL кешей и отслеживания SLA в продакшен Golang-сервисах.

Как это работает

time знаменита batteries-included: net/http (production-уровневый HTTP клиент + сервер), encoding/json/xml/csv (сериализация), database/sql (интерфейс — в паре с драйвером типа pgx, go-sql-driver/mysql), os + os/exec + io/fs (файлы, процессы), crypto/* (хеширование, шифры, TLS), context (cancellation + значения), time, regexp, text/template / html/template, log/slog (структурированное логирование, 1.21+).

Когда применять

По умолчанию stdlib — большинство, к чему тянутся в npm/pip других языков, уже в Go-stdlib. log/slog — для нового логирования (заменяет log + logrus + zap для большинства нужд). net/http-сервер напрямую — пока реально не нужен фреймворк. database/sql + драйвер — вместо ORM, кроме случая многих тривиальных CRUD-эндпойнтов.

Типичные ошибки

Ловушки time: свой HTTP-роутинг вместо net/http.ServeMux (route patterns в 1.22 — достаточно для многих приложений); игнор http.Server.ReadTimeout и WriteTimeout (slowloris / hung-connection уязвимости); time.Now() прямо в тестах (мок через интерфейс или clockwork); json.Marshal неэкспортированных полей struct (тихо ноль — пишите с заглавной или используйте json:"...").

Связанные понятия

Полезные ресурсы