Go: Линтеры

7 вопросов

1 Что такое golangci-lint? Как настроить?

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: true
Открыть отдельно →
2 Чем отличаются gofmt, goimports и gofumpt?

gofmt - стандартный форматтер (стиль отступов, переносы). goimports - gofmt плюс добавление/удаление неиспользуемых импортов по коду. gofumpt - строже gofmt: дополнительные правила форматирования (пустые строки, составные литералы). Часто в проектах используют goimports или gofumpt в pre-commit и CI.

gofmt -w .
goimports -w .
gofumpt -w .
Открыть отдельно →
3 Что проверяет go vet?

go vet - встроенный статический анализатор. Находит подозрительные конструкции: неправильное использование printf-подобных функций, копирование мьютексов, неиспользуемые результаты, недостижимый код и др. Запуск: go vet ./.... Расширяется через go install golang.org/x/tools/go/analysis/passes/... и go vet -vettool=....

go vet ./...
# например: copylocks, printf, unreachable
Открыть отдельно →
4 Что такое staticcheck? Примеры правил.

staticcheck - набор правил поверх go/analysis: стиль кода, типичные ошибки, упрощения. Примеры: проверка на strings.Replace с n=0, неиспользуемые переменные, неправильное сравнение с nil для ошибок, избыточные type assertions. Запуск: staticcheck ./... или через golangci-lint (линтер staticcheck).

staticcheck ./...
# SA, S1xxx - style, ST - simplifications
Открыть отдельно →
5 Как написать свой линтер для Go?

Используют пакет 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
}
Открыть отдельно →
6 Какие линтеры чаще всего включают в Go-проектах?

Типичный набор: 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, ...]
Открыть отдельно →
7 Как интегрировать линтеры в CI?

В 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
Открыть отдельно →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.