⏱ Почему в Go нельзя полагаться на системное время?
В этой разобрали интересный кейс: монотоное и «стеночное» время (monotonic vs wall clock) в Go.
🔍 В чём проблема?
time.Now() в Go возвращает смешанное время:
— *монотоное* (для измерений)
— *реальное «стеночное»* (часы системы)
Если неправильно использовать это время в вычислениях (например, при сравнении таймштампов), можно получить неожиданные баги:
— прыжки при изменении системных часов
— некорректные таймауты и дедлайны
— рассинхрон в распределённых системах
💡 Рекомендация: для измерений использовать монотоное время (`Since`, `Until`), а для логов и меток — преобразовывать только wall clock.
📌 Пример:
Но если сохранить time.Time в лог или БД и потом пересчитать разницу:
Если за это время системное время изменилось (например, ntpd подвинуло часы), elapsed может быть отрицательным или неверным.
💣 В распределённых системах это особенно опасно:
- Неправильные таймауты
- Нарушение дедлайнов
- Отказ retry‑механизмов
📌 Полный разбор
В этой разобрали интересный кейс: монотоное и «стеночное» время (monotonic vs wall clock) в Go.
🔍 В чём проблема?
time.Now() в Go возвращает смешанное время:
— *монотоное* (для измерений)
— *реальное «стеночное»* (часы системы)
Если неправильно использовать это время в вычислениях (например, при сравнении таймштампов), можно получить неожиданные баги:
— прыжки при изменении системных часов
— некорректные таймауты и дедлайны
— рассинхрон в распределённых системах
💡 Рекомендация: для измерений использовать монотоное время (`Since`, `Until`), а для логов и меток — преобразовывать только wall clock.
📌 Пример:
start := time.Now()
time.Sleep(5 * time.Second)
elapsed := time.Since(start) // работает корректно, потому что Go использует монотоное время
Но если сохранить time.Time в лог или БД и потом пересчитать разницу:
start := time.Now()
// сохраняем start куда-то...
// позже:
elapsed := time.Now().Sub(start) // ❌ здесь может быть ошибка!
Если за это время системное время изменилось (например, ntpd подвинуло часы), elapsed может быть отрицательным или неверным.
💣 В распределённых системах это особенно опасно:
- Неправильные таймауты
- Нарушение дедлайнов
- Отказ retry‑механизмов
📌 Полный разбор
👍21❤8🔥1🥰1
Forwarded from Golang
Внутри:
- Минималистичный симулятор горутин и каналов прямо в браузере
- Работает через Go WebAssembly — никакого сервера не требуется
- Наглядно объяснены
select
, fan-in/fan-out, worker pool, таймауты и про- Код можно редактировать на лету
Сохрани в закладки и тренируй мышление «конкурентного» Go-разработчика:
https://concurrency.rocks
#golang
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍5❤4
💣 Вечные споры о структуре Go-проектов: где правда?
В Go-сообществе регулярно всплывает один и тот же вопрос: «Как правильно организовать репозиторий?» Старые блоги предлагают сложные структуры, а официальный гайд от Go team многим кажется слишком абстрактным.
Автор этой статьи предлагает радикально простой подход: не усложняйте, пока в этом нет реальной необходимости. Он советует начать с минимальной структуры, расширять её по мере роста проекта и не бояться переделывать.
Большинству проектов попросту не нужны ни
В Go-сообществе ценится простота, и добавление лишних слоев в структуру проекта противоречит этой философии.
🔗https://laurentsv.com/blog/2024/10/19/no-nonsense-go-package-layout.html
@golang_google
В Go-сообществе регулярно всплывает один и тот же вопрос: «Как правильно организовать репозиторий?» Старые блоги предлагают сложные структуры, а официальный гайд от Go team многим кажется слишком абстрактным.
Автор этой статьи предлагает радикально простой подход: не усложняйте, пока в этом нет реальной необходимости. Он советует начать с минимальной структуры, расширять её по мере роста проекта и не бояться переделывать.
Большинству проектов попросту не нужны ни
internal/
, ни pkg/
, ни даже cmd/
, особенно если вы пишете небольшой сервис или утилиту. В Go-сообществе ценится простота, и добавление лишних слоев в структуру проекта противоречит этой философии.
🔗https://laurentsv.com/blog/2024/10/19/no-nonsense-go-package-layout.html
@golang_google
❤10👍8🔥5