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-багов |
Типовые вопросы
- Зачем gofmt, если есть formatter в IDE?
- IDE удобна, но CI должен проверять канонический результат независимо от редактора.
- Может ли vet сломать build?
- Он возвращает ненулевой статус при diagnostic; это сознательный quality gate, но не компилирует вместо
go test.
- Он возвращает ненулевой статус при diagnostic; это сознательный quality gate, но не компилирует вместо
- Что добавляет staticcheck?
- Более широкий набор проверок correctness/performance/style и deprecated API поверх базового toolchain.
- Нужно ли запускать линтер на generated code?
- Зависит от генератора и политики; обычно правят источник генерации или исключают каталог явно, а не маскируют проблемы во всём проекте.
- Как поступить с false positive?
- Проверить версию и документацию правила, изменить код для ясности либо оставить минимальное обоснованное подавление.
Практика
- Добавьте format-check,
go vet ./...иstaticcheck ./...в CI. Готово: чистый checkout проходит, а искусственно неформатированный файл и известная диагностика ломают нужный шаг. - Разберите один diagnostic. Готово: описаны правило, риск, безопасное исправление и причина, почему тест мог его не увидеть.
Частые ошибки и ловушки
- Форматировать только изменённый файл и оставлять репозиторий в разном стиле.
- Принять suggestion линтера без понимания семантики и регрессии.
- Смешать несовместимые версии Go, staticcheck и generated-кода.
- Выключить весь analyzer ради одного legacy-места.
Связанные темы
Инструменты Go · Тестирование · Интервью-практика