Agent skill
go-linting
Use when setting up linting, configuring golangci-lint, or fixing linter warnings in Go projects. Provides recommended linter sets, golangci-lint configuration, CI integration, and Makefile targets.
Install this agent skill to your Project
npx add-skill https://github.com/saisudhir14/claude-skills/tree/main/skills/go-linting
Metadata
Additional technical details for this skill
- tags
- golang go linting golangci-lint staticcheck revive govet ci
- author
- saisudhir14
- category
- languages
SKILL.md
Go Linting
Recommended linters and configuration for Go projects.
golangci-lint Setup
golangci-lint is the standard linter aggregator for Go. Install it as a tool dependency in your module:
# Add to go.mod (Go 1.24+)
go get -tool github.com/golangci/golangci-lint/cmd/golangci-lint
# Or install directly
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Recommended Configuration
Place .golangci.yml at the project root. This uses the golangci-lint v2 config format:
version: "2"
run:
timeout: 5m
go: "1.25"
linters:
enable:
- errcheck # unchecked errors
- govet # go vet checks
- staticcheck # comprehensive static analysis (includes gosimple)
- revive # flexible linter, replaces golint
- ineffassign # unused assignments
- unused # unused code
- misspell # spelling in comments and strings
- unconvert # unnecessary type conversions
- gocritic # opinionated style and performance checks
- errname # error naming conventions (Err prefix)
- errorlint # error wrapping patterns
- copyloopvar # loop variable copy issues (pre-Go 1.22)
- nilerr # returning nil when err is not nil
- bodyclose # unclosed HTTP response bodies
- prealloc # slice preallocation
settings:
revive:
rules:
- name: exported
arguments:
- "checkPrivateReceivers"
- name: blank-imports
- name: context-as-argument
- name: context-keys-type
- name: error-return
- name: error-strings
- name: error-naming
- name: increment-decrement
- name: var-naming
- name: package-comments
- name: range
- name: receiver-naming
- name: indent-error-flow
- name: empty-block
- name: superfluous-else
- name: unreachable-code
- name: redefines-builtin-id
gocritic:
enabled-tags:
- diagnostic
- style
- performance
errcheck:
check-type-assertions: true
check-blank: true
govet:
enable-all: true
exclusions:
rules:
# Allow unused parameters in interface implementations
- linters:
- revive
text: "unused-parameter"
# Test files can use dot imports
- path: _test\.go
linters:
- revive
text: "dot-imports"
formatters:
enable:
- goimports # import formatting and grouping
settings:
goimports:
local-prefixes:
- yourcompany.com
issues:
max-issues-per-linter: 0
max-same-issues: 0
Update local-prefixes under formatters.settings.goimports to match your module path.
Note: this config uses golangci-lint v2 format (version: "2"). If you are on golangci-lint v1, run golangci-lint migrate to convert, or remove the version line and move formatters back into linters.
Makefile Integration
.PHONY: lint lint-fix
lint: ## Run linters
go tool golangci-lint run ./...
lint-fix: ## Run linters with auto-fix
go tool golangci-lint run --fix ./...
If golangci-lint is not a tool dependency:
lint:
golangci-lint run ./...
CI Integration
GitHub Actions
name: lint
on: [push, pull_request]
jobs:
golangci-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.25"
- uses: golangci/golangci-lint-action@v6
with:
version: latest
Per-Linter Guidance
errcheck
Finds unchecked errors. Fix by handling or explicitly ignoring:
// Wrong: error ignored silently
json.Unmarshal(data, &v)
// Correct: handle the error
if err := json.Unmarshal(data, &v); err != nil {
return fmt.Errorf("unmarshal config: %w", err)
}
errorlint
Enforces proper error wrapping and comparison:
// errorlint flags this: use errors.Is instead
if err == ErrNotFound { }
// Correct
if errors.Is(err, ErrNotFound) { }
bodyclose
Catches unclosed HTTP response bodies:
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close() // bodyclose checks for this
govet
Runs the same checks as go vet plus additional analyzers. Key checks:
- printf: format string / argument mismatch
- shadow: variable shadowing
- structtag: malformed struct tags
- copylocks: passing locks by value
Suppressing False Positives
//nolint:errcheck // intentionally ignoring close error on read-only file
_ = f.Close()
//nolint:gocritic // hugeParam: passing by value is intentional here
func process(cfg Config) { }
Use //nolint comments sparingly. Prefer fixing the issue over suppressing it.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
go-project-layout
Use when starting a new Go project, organizing packages, or restructuring an existing Go codebase. Covers standard directory layout, package design, Makefile targets, Dockerfile patterns, and module setup.
go-code-review
Use when reviewing Go code or preparing code for review. Quick-reference checklist covering naming, error handling, concurrency, testing, imports, documentation, and common pitfalls. Based on Go Wiki CodeReviewComments.
go-concurrency
Use when writing, reviewing, or debugging concurrent Go code. Covers goroutine lifecycle management, channels, errgroup, mutexes, atomics, sync.Map, and synchronous-first design. Based on Google and Uber style guides.
go-security
Use when writing, reviewing, or auditing Go code for security. Covers input validation, SQL injection prevention, path traversal, secrets management, cryptography, HTTP security headers, and dependency scanning.
go-error-handling
Use when writing, reviewing, or debugging Go error handling code. Covers error wrapping, sentinel errors, custom error types, error joining, single handling, and error flow patterns. Based on Google and Uber style guides.
go-performance
Use when writing, reviewing, or optimizing Go code for performance. Covers string operations, memory allocation, preallocating slices and maps, strings.Builder, strconv, container-aware GOMAXPROCS, and runtime considerations for Go 1.25.
Didn't find tool you were looking for?