7 вопросов
golangci-lint - агрегатор линтеров для Go (десятки линтеров в одном запуске). Установка: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest. Запуск: golangci-lint run ./.... Конфиг: .golangci.yml в корне - включение/отключение линтеров, правила, исключения.
linters:
enable: [errcheck, staticcheck, gosimple]
disable: [deadcode]
linters-settings:
errcheck:
check-type-assertions: truegofmt - стандартный форматтер (стиль отступов, переносы). goimports - gofmt плюс добавление/удаление неиспользуемых импортов по коду. gofumpt - строже gofmt: дополнительные правила форматирования (пустые строки, составные литералы). Часто в проектах используют goimports или gofumpt в pre-commit и CI.
gofmt -w .
goimports -w .
gofumpt -w .go vet - встроенный статический анализатор. Находит подозрительные конструкции: неправильное использование printf-подобных функций, копирование мьютексов, неиспользуемые результаты, недостижимый код и др. Запуск: go vet ./.... Расширяется через go install golang.org/x/tools/go/analysis/passes/... и go vet -vettool=....
go vet ./...
# например: copylocks, printf, unreachablestaticcheck - набор правил поверх go/analysis: стиль кода, типичные ошибки, упрощения. Примеры: проверка на strings.Replace с n=0, неиспользуемые переменные, неправильное сравнение с nil для ошибок, избыточные type assertions. Запуск: staticcheck ./... или через golangci-lint (линтер staticcheck).
staticcheck ./...
# SA, S1xxx - style, ST - simplificationsИспользуют пакет golang.org/x/tools/go/analysis: определяют Analyzer с Run-функцией, обходят AST (пакет go/ast), сообщают о проблемах через pass.Reportf. Анализатор можно подключать к go vet -vettool, multichecker или golangci-lint (как custom plugin). Документация: golang.org/x/tools.
var myAnalyzer = &analysis.Analyzer{
Name: "myanalyzer",
Run: run,
}
func run(pass *analysis.Pass) (interface{}, error) {
ast.Inspect(pass.Files[0], func(n ast.Node) bool {
// report if needed
return true
})
return nil, nil
}Типичный набор: errcheck (проверка ошибок), staticcheck или gosimple (качество и упрощения), ineffassign (неэффективные присваивания), revive или golint (стиль), gosec (безопасность), gofmt/goimports (форматирование). В golangci-lint часто включают пресет recommended и добавляют gosec, exhaustive (проверка switch по enum).
# .golangci.yml
linters:
enable-all: true
disable: [lll, funlen, ...]В CI (GitHub Actions, GitLab CI, etc.) запускают линтер на этапе проверки: golangci-lint run ./... с нужным конфигом. Кэшируют установку бинарника и модули. При падении - билд не проходит. Дополнительно: go vet, go test. Иногда задают минимальный уровень (например, только ошибки) через --max-issues-per-linter и --max-same-issues.
# GitHub Actions
- run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55
- run: golangci-lint run --timeout=5m