Назад
Golang

Подводные камни миграции на 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

Как по мне, лучше не торопиться с обновлением и подождать какое-то время. За это время уже какое-то кол-во проектов пройдет процесс миграции, и можно будет подхватить "костыли"/фиксы налету и интегрировать в свой проект, чтобы отделаться "малой кровью"