go vet и golangci-lint

Тема дорожной карты · Golang

go vet — инструмент статического анализа, встроенный в Go-тулчейн, который исследует исходный код Go и сообщает о подозрительных конструкциях, которые компилятор принимает, но которые почти наверняка являются ошибками программиста. Он обнаруживает широкий спектр проблем: несоответствие глаголов и аргументов форматирования в стиле Printf, некорректное использование sync/atomic, блокировки, скопированные по значению, недостижимый код, неправильно сформированные теги структур и некорректный синтаксис директив //go:build. Запуск go vet ./... занимает считанные секунды и является стандартной практикой перед каждым коммитом и в каждом CI-пайплайне наряду с go test -race ./... и gofmt -l . для обеспечения качества кода в Golang-проектах. go vet расширяем — дополнительные анализаторы из golang.org/x/tools/go/analysis (такие как shadow, nilness, unusedresult) можно скомпоновать в пользовательские vet-бинарники или вывести через golangci-lint, метализатор сообщества, объединяющий go vet с десятками специализированных линтеров. Поскольку go vet сообщает только о высококонфидентных проблемах с очень низким уровнем ложных срабатываний, любой CI-пайплайн, пропускающий его, рискует поставить в продакшен тонкие баги конкурентности, уязвимости форматных строк и ошибки использования интерфейсов.

Как это работает

go vet и golangci-lint использует Go modules (с 1.11) — go mod init, go mod tidy, go mod download, go.mod + go.sum файлы. Module path — префикс импорта; semver enforced; go-команда обрабатывает vendoring (go mod vendor) и проксирование через proxy.golang.org. Тулчейн: go build, go run, go test, go fmt, go vet, go install, go work (multi-module workspaces). Third-party: staticcheck, golangci-lint.

Когда применять

Всегда коммитьте go.sum (верифицирует контрольные суммы модулей). go mod tidy регулярно — держите go.mod минимальным. replace-директива в go.mod — для локальной разработки зависимости. golangci-lint в CI — пакетирует vet, staticcheck, errcheck и десятки полезных линтеров. Для приватных модулей GOPRIVATE=*.yourcompany.ru — обходит публичный прокси.

Типичные ошибки

Ловушки go vet и golangci-lint: pre-1.11 GOPATH-workflow (давно мёртв — кто учит этому, учит устаревшему Go); replace-директивы оставлены в production go.mod (используйте build-time-only override); коммит папки vendor/ без -mod=vendor policy в CI; go install вне модуля (в старом Go ставило в $GOPATH/bin, в новом требует @version).

Связанные понятия

Полезные ресурсы