Подводные камни миграции на Go 1.26 ⚠️
В прошлом посте я рассказывал, почему стоит обновиться до Go 1.26 - новые фичи, производительность, удобства. Да, в go 1.26 есть несколько интересных фич, но давайте рассмотрим подводные камни для данной миграции, чтобы не уронить проект такой доработкой
Хорошая новость: breaking changes минимальны. Go команда традиционно избегает радикальных ломок. Плохая - в 1.26 есть несколько изменений, которые могут уронить ваш проект в редких случаях. Давайте разберём основные подводные камни и как их обойти.
1. Новый дефолтный go в go.mod при go mod init
Что изменилось?
go mod init теперь ставит более консервативную версию Go в новый go.mod:
- При использовании Go 1.26 - дефолт go 1.25.0
- В RC - даже go 1.24.0
Проблема:
Если создаёте новый модуль, он не будет сразу использовать фичи Go 1.26 (например, new(expr)).
Решение:
Сразу после init обновите версию:
go get go@1.26
# или вручную в go.mod: go 1.26
go mod tidy
2. Удалённые инструменты: cmd/doc и go tool doc
Что случилось?
Эти устаревшие команды полностью удалены.
Проблема:
Если в скриптах или Makefile используете go tool doc - сломается.
Решение:
Перейдите на go doc - функционал тот же:
go doc ./... # вместо go tool doc
3. Новый GC (Green Tea) и специализированный allocator по умолчанию
Что нового?
- Green Tea GC включён всегда (был экспериментальным).
- Small allocations (<512B) - до 30% быстрее.
- Больше объектов на стеке.
Проблема:
В редких случаях (allocation-heavy код, unsafe, race detector) может измениться поведение или производительность. Иногда регресс ~1-5%.
Решение:
Если заметили проблемы - временно отключите:
GOEXPERIMENT=nogreenteagc,nosizespecializedmalloc go run ./...Но учтите: эти флаги удалят в Go 1.27 - лучше просто поправьте сразу.
Для диагностики stack allocations:
go build -gcflags=all=-d=variablemakehash=0
4. Строгий парсинг URL в net/url.Parse
Что изменилось?
Теперь отвергает хосты с несколькими : (типа localhost:8080:80).
Проблема:
Если ваш код парсит "креативные" URL - может начать падать.
Решение:
Временно верните старое поведение:
GODEBUG=urlstrictcolons=0 ./your-binaryНо лучше почистить код/входные данные.
5. Изменения в crypto: игнор custom rand.Reader
Что изменилось?
Функции вроде ecdsa.GenerateKey игнорируют переданный rand.Reader - всегда используют системный secure random.
Проблема:
Если в тестах передавали детерминированный reader - теперь ключи будут случайными.
Решение:
Используйте новый testing/cryptotest.SetGlobalRandom для детерминированных тестов.
6. go fix стал агрессивнее
Теперь использует современные analyzers и может переписать больше кода (например, заменить циклы на slices.Contains).
Проблема:
Может изменить стиль кода неожиданно.
Решение:
Запускайте с флагами и ревьюьте изменения:
go fix -forvar ./... # пример selective
Как по мне, лучше не торопиться с обновлением и подождать какое-то время. За это время уже какое-то кол-во проектов пройдет процесс миграции, и можно будет подхватить "костыли"/фиксы налету и интегрировать в свой проект, чтобы отделаться "малой кровью"