gofmt, goimports, go vet и staticcheck

Форматтер делает представление кода единообразным, а статический анализ ищет вероятные ошибки без запуска программы. Это разные проверки: отформатированный код может быть неверным, а тестируемый — содержать неисполнявшуюся ошибочную ветку.

Зачем это на интервью

Кандидат должен назвать базовый quality gate и не выдавать линтер за доказательство корректности или безопасности.

Минимум для E4

  • Форматировать исходники gofmt -w $(find . -path ./vendor -prune -o -name '*.go' -print) или проверять CI тем же списком файлов.
  • Запускать go vet ./... вместе с тестами.
  • Понимать, что goimports форматирует и добавляет/удаляет импорты, но является внешним инструментом.
  • Исправлять предупреждение либо документированно подавлять его точечно, а не выключать весь анализатор.
gofmt -w $(find . -path ./vendor -prune -o -name '*.go' -print)
test -z "$(find . -path ./vendor -prune -o -name '*.go' -print0 | xargs -0 gofmt -l)"
go vet ./...
go install honnef.co/go/tools/cmd/staticcheck@latest
staticcheck ./...

Углубление для E5/Senior

gofmt — часть toolchain и намеренно не настраивается стилевыми опциями: спор о пробелах не должен занимать review. goimports из golang.org/x/tools/cmd/goimports группирует и чинит imports; фиксируйте его версию в инструментальном модуле или CI, а не надейтесь на рабочую станцию.

go vet запускает набор analyzers из Go toolchain и особенно ценен для ошибок формата printf, копирования lock-containing значений и неверного использования API. Он не заменяет compiler, тесты или security-аудит. staticcheck добавляет проверки correctness, performance, simplification и deprecated API; версии Go и staticcheck должны быть совместимы. Полезные анализаторы можно писать через go/analysis, если организационное правило достаточно стабильно и даёт мало false positives.

Ключевые понятия

ИнструментОсновной результатНе гарантирует
gofmtканонический форматкорректность поведения
goimportsформат + importsархитектурные правила
go vetизвестные подозрительные паттерныпокрытие тестами
staticcheckрасширенная статическая диагностикаотсутствие runtime-багов

Типовые вопросы

  1. Зачем gofmt, если есть formatter в IDE?
    • IDE удобна, но CI должен проверять канонический результат независимо от редактора.
  2. Может ли vet сломать build?
    • Он возвращает ненулевой статус при diagnostic; это сознательный quality gate, но не компилирует вместо go test.
  3. Что добавляет staticcheck?
    • Более широкий набор проверок correctness/performance/style и deprecated API поверх базового toolchain.
  4. Нужно ли запускать линтер на generated code?
    • Зависит от генератора и политики; обычно правят источник генерации или исключают каталог явно, а не маскируют проблемы во всём проекте.
  5. Как поступить с false positive?
    • Проверить версию и документацию правила, изменить код для ясности либо оставить минимальное обоснованное подавление.

Практика

  • Добавьте format-check, go vet ./... и staticcheck ./... в CI. Готово: чистый checkout проходит, а искусственно неформатированный файл и известная диагностика ломают нужный шаг.
  • Разберите один diagnostic. Готово: описаны правило, риск, безопасное исправление и причина, почему тест мог его не увидеть.

Частые ошибки и ловушки

  • Форматировать только изменённый файл и оставлять репозиторий в разном стиле.
  • Принять suggestion линтера без понимания семантики и регрессии.
  • Смешать несовместимые версии Go, staticcheck и generated-кода.
  • Выключить весь analyzer ради одного legacy-места.

Связанные темы

Инструменты Go · Тестирование · Интервью-практика

Источники