В Go 1.26
go fix переписан с нуля. Теперь это полноценный движок модернизации: заменяет if/else на min/max, переписывает циклы на range-over-int, подставляет strings.Cut вместо strings.Index — и ещё десятки трансформаций за один запуск.Звучит удобно. Но после
go fix ./... код может сломаться или, хуже, молча изменить поведение.Два типа конфликтов
Синтаксические —
go fix ловит сам и просит запустить повторно.Семантические — опаснее. Две независимые правки вместе могут сделать переменную неиспользуемой — и это уже ошибка компиляции. Лишние импорты инструмент уберёт сам, но с переменными придётся разбираться вручную.
Тихие изменения поведения
appendclipped заменяет append([]T(nil), s...) на slices.Clone(s). Если s пустой — Clone вернёт nil. Для JSON это разница между null и []. Анализатор по умолчанию выключен, но показательно.slicescontains заменяет цикл на slices.Contains. Если выражение для искомого элемента имело побочные эффекты — поведение изменится. Этот баг попал в трекер и был исправлен в 1.26.3.Как работать безопасно
Сначала смотрите diff без применения:
go fix -diff ./...
Запускайте из чистого git-состояния, в отдельной ветке.
Если сломалось — изолируйте анализатор:
go fix -slicescontains=false ./...
go fix -minmax ./...
Не забывайте про платформы: один запуск обрабатывает только текущую конфигурацию сборки. Для мультиплатформенных проектов запускайте с разными
GOOS/GOARCH.go fix — мощный инструмент, но не автопилот.📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max
🐸 Библиотека Go-разработчика
#GoDeep
