Go 1.25: свежий релиз принес умные контейнеры и экспериментальный сборщик мусора
- пятница, 15 августа 2025 г. в 00:00:09
12 августа команда Go представила новую версию языка — Go 1.25. Релиз получился не самым крупным по количеству изменений в языке (их вообще нет), но принес несколько интересных улучшений в рантайме и инструментах, которые стоит обсудить.
Как разработчик, работающий в основном с микросервисами, я особенно обратил внимание на несколько ключевых нововведений. Давайте разберем основные измененения.
Самое важное изменение для тех, кто работает с контейнерами и Kubernetes — это новый container-aware GOMAXPROCS. Теперь Go автоматически учитывает лимиты CPU из cgroup при установке значения GOMAXPROCS.
Раньше приходилось либо ставить GOMAXPROCS вручную, либо использовать библиотеки вроде automaxprocs от Uber. Теперь это работает из коробки:
На Linux рантайм смотрит на лимиты CPU bandwidth в cgroup
Если лимит меньше количества логических процессоров, GOMAXPROCS устанавливается в меньшее значение
Значение обновляется динамически, если лимиты изменяются на лету
Работает только если GOMAXPROCS не установлен явно через переменную окружения или runtime.GOMAXPROCS()
Это решает давнюю проблему, когда Go-приложения в контейнерах создавали слишком много горутин и неэффективно использовали ресурсы.
Еще одна крутая штука — новый экспериментальный garbage collector greenteagc. По заявлениям разработчиков, он снижает накладные расходы на GC на 10-40% в приложениях с большим количеством мелких объектов. Включается через GOEXPERIMENT=greenteagc
при сборке. Пока что это эксперимент, но команда Go просит попробовать и поделиться отзывами.
Экспериментальный пакет encoding/json/v2 — это переписанная с нуля реализация JSON-обработки. Основные улучшения:
Существенно быстрее декодирование (кодирование на том же уровне)
Новые опции конфигурации для маршаллинга и анмаршаллинга
Отдельный пакет encoding/json/jsontext для низкоуровневой обработки синтаксиса
Включается через GOEXPERIMENT=jsonv2
Учитывая, что в проектах JSON используется повсеместно, это может дать неплохой буст производительности. Правда, пока это эксперимент, так что в продакшен рано, но для тестирования очень интересно.
Новый пакет testing/synctest решает давнюю проблему тестирования concurrent кода. Основные возможности:
Функция Test запускает тесты визолированном «пузыре»
Внутри пузыря время виртуализировано — time пакет работает с фейковыми часами
Часы двигаются мгновенно, если все горутины заблокированы
Функция Wait ждет, пока все горутины в пузыре заблокируются
Это должно упростить написание тестов для кода с таймерами, таймаутами и сложной синхронизацией. Раньше такие тесты были либо медленными (реальные таймауты), либо флакичными.
Добавили новый метод WaitGroup.Go(), который упрощает распространенный паттерн:
// Было
wg.Add(1)
go func() {
defer wg.Done()
doWork()
}()
// Стало
wg.Go(doWork)
Мелочь, но приятная. Сколько раз писал этот паттерн — не счесть.
Новый runtime/trace.FlightRecorder — это как «черный ящик» для Go-приложений. Он постоянно записывает trace в кольцевой буфер в памяти, а при возникновении проблемы можно сохранить последние несколько секунд trace в файл. Очень полезно для отладки редких проблем в продакшене, когда постоянная запись trace слишком дорогая, а воспроизвести проблему сложно.
Несколько важных изменений в компиляторе:
DWARF 5 поддержка — уменьшает размер отладочной информации и ускоряет линковку
Исправление nil pointer bug — теперь компилятор корректно проверяет nil указатели, как того требует спецификация
Улучшения для слайсов — компилятор чаще размещает backing store для слайсов на стеке
Также улучшили go vet — добавили анализаторы waitgroup и hostport для поиска типичных ошибок.
В net/http появился CrossOriginProtection — встроенная защита от CSRF атак. Использует современные Fetch metadata от браузеров, не требует токенов или cookies. Поддерживает обходы по origin и паттернам. Хорошее дополнение для веб-разработчиков на Go — раньше приходилось использовать сторонние библиотеки или писать самому.
Go 1.25 продолжает традицию осторожного, но продуманного развития языка. Команда не стремится к радикальным изменениям, а фокусируется на практических улучшениях, которые реально помогают в ежедневной работе.
В целом, релиз получился очень практичным. Нет wow-эффекта от новых языковых возможностей, но есть конкретная польза для реальных проектов. Именно за это и ценю Go — стабильность, обратная совместимость и акцент на продуктивности разработчика.