✏️ Go наводит порядок в флагах GODEBUG — 10 июня 2026 г. в 07:00:03.656
✏️ 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, стоит следить за заметками к релизам, чтобы не словить фатальную ошибку после обновления.

