Ответ
Статический анализ — это неотъемлемая часть разработки на Go для поддержания высокого качества кода, его консистентности и предотвращения ошибок.
Основной инструмент: golangci-lint
В экосистеме Go стандартом де-факто является golangci-lint
.
Почему именно он:
- Агрегатор: Он объединяет десятки лучших линтеров под одной оболочкой.
- Скорость: Умное кэширование и параллельный запуск делают его очень быстрым.
- Конфигурация: Легко настраивается через один YAML-файл (
.golangci.yml
), где можно включать/выключать линтеры и правила. - Интеграция: Просто интегрируется в CI/CD пайплайны (GitHub Actions, GitLab CI) и редакторы кода (VS Code, GoLand).
Пример конфигурации .golangci.yml
:
run:
timeout: 5m
linters:
enable:
- govet # Находит подозрительные конструкции
- errcheck # Проверяет, что все ошибки обрабатываются
- staticcheck # Огромный набор проверок на баги и производительность
- unused # Находит неиспользуемый код
- gosec # Ищет уязвимости в коде
- goimports # Проверяет форматирование и порядок импортов
issues:
exclude-rules:
# Пример исключения: не требовать проверку ошибок для fmt.Fprintf
- path: _test.go
linters:
- errcheck
Ключевые линтеры, которые он объединяет:
govet
: Стандартный линтер от команды Go. Находит очевидные ошибки, например, передачуsync.Mutex
по значению.errcheck
: Гарантирует, что вы не проигнорировали возвращаемую ошибку.staticcheck
: Мощный набор статических проверок, находит баги, мертвый код и проблемы с производительностью.gosec
: Сканер безопасности, который ищет потенциальные уязвимости, такие как использование слабых криптографических алгоритмов или SQL-инъекции.
Запуск и интеграция:
Линтер обычно запускается локально перед коммитом и обязательно в CI/CD:
# Запустить анализ для всего проекта
golangci-lint run ./...