TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7239 2.93K
✏️ Go наводит порядок в флагах GODEBUG

Команда Go опубликовала предложение с политикой устаревания и удаления флагов GODEBUG. Это обсуждение задаёт правила, по которым старые флаги будут помечать устаревшими, а потом убирать из дистрибутива.

Сами флаги появились как способ смягчить переход между версиями. Гарантия совместимости Go 1 обещает, что рабочий код продолжит собираться и работать, но иногда исправления безопасности всё же меняют поведение программ. Чтобы дать время на адаптацию, ввели переменную GODEBUG.

Например, в Go 1.21 вызов panic(nil) стал ошибкой времени выполнения, а флаг panicnil=1 возвращает старое поведение Go 1.20. За 13 лет таких флагов накопилось много, и каждый из них это точка расхождения в поведении тулчейна. Это усложняет тестирование и поднимает стоимость поддержки.

Что предлагают

Предложение делит флаги на четыре категории по сложности удаления.

Самые простые уже удалены раньше, как x509sha1.

Дальше идут флаги с заранее объявленной датой удаления, например gotypesalias, который можно убрать не раньше Go 1.27.

Третья группа это флаги без даты удаления и без статуса постоянных, им сначала назначат дату.

Четвёртая и самая сложная группа это флаги, объявленные постоянными, как netdns, для их удаления нужно отдельное обоснованное предложение.

Сам процесс устроен так: в релизе перед удалением флаг помечают устаревшим и объявляют об удалении в следующей версии. Если серьёзных возражений нет, флаг убирают. Если кто-то покажет критическую зависимость от старого поведения, удаление откладывают на один релизный цикл. Флаги, добавленные ради совместимости, обязаны жить минимум два года.

Как это сделают технически

Внутренний пакет godebug получает статус флага:
type FlagStatus int
const (
Active FlagStatus = iota
Deprecated
Removed
)


Сборочные инструменты будут предупреждать об устаревших флагах, а тесты сообщать об ошибке. Предлагается и новый флаг deprecatedgodebug=0, который заставит программу упасть с паникой при попытке выставить устаревший флаг в недефолтное значение.

Удалённый флаг всё ещё можно задать в его финальное значение по умолчанию, но любое другое значение вызовет фатальную ошибку. Имена удалённых флагов больше никогда не переиспользуют, чтобы старое имя случайно не получило новый смысл.

Пока это предложение на стадии обсуждения, а не финальное решение. Связанный тикет #75316 уже применяет новую логику и предлагает убрать набор крипто флагов из Go 1.23 и раньше в релизе Go 1.27. Если вы держите в go.mod строки с GODEBUG, стоит следить за заметками к релизам, чтобы не словить фатальную ошибку после обновления.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoLive
  • ❤ 4
More from @goproglib
  1. Sep 29, 2026👨‍💻 Библиотека для написания LSP-серверов Написать свой Language Server с нуля на Go сло…
  2. Sep 28, 2026🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — 1 true / 0 false 🔥 — 1 true /…
  3. Sep 28, 2026👩‍💻 Что на самом деле происходит внутри Go map? После Go 1.24 обычный map внутри работае…
  4. Sep 26, 2026🔥 В Go 1.27 появился portable SIMD До этого SIMD-оптимизации в Go требовали архитектурног…
  5. Sep 25, 2026🤡🤡 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoGiggle
  6. Sep 25, 2026💡 Код работает. А data race уже есть В Go можно записать значение в одной горутине, прочи…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →