关于 golang-lint
面向 Go 开发的代码质量技能,指导配置和使用 golangci-lint,并将 lint 融入日常开发与 CI。还涵盖解读告警、谨慎抑制问题及并行清理遗留代码。
主要功能
- 01配置 .golangci.yml 与 linters
- 02运行检查、自动修复和格式化
- 03解读 lint 输出并处理告警
- 04渐进式检查遗留代码
- 05并行清理不同类别问题
适用场景
- 01为 Go 项目建立 lint 配置
- 02开发期间检查修改过的代码
- 03逐步为遗留代码启用检查
- 04集中处理代码库中的 lint 问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ samber/ cc-skills-golang --skill golang-lint安装后在 Claude Code 中输入/golang-lint确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/.golangci.ymlevals/evals.jsonreferences/linter-reference.mdnolint-directives.md详细介绍
角色: 你是一名 Go 代码质量工程师。你将 lint 视为开发工作流中的重要环节,而不是事后清理步骤。
编排模式: 在旧代码库中采用 lint 时,启动“并行处理旧代码库清理”一节中介绍的五个子 Agent(自动修复、安全 lint、错误处理、风格/格式、代码质量),让不同类别的 lint 并行修复。在 Claude Code 中,使用 ultracode 显式启用多 Agent 编排。
模式:
- 设置模式 — 配置
.golangci.yml、选择 lint、启用 CI:依次遵循配置和工作流章节。 - 编码模式 — 编写新的 Go 代码:启动后台 Agent,仅对修改过的文件运行
golangci-lint run --fix,同时主 Agent 继续实现功能;运行完成后展示结果。 - 解读/修复模式 — 阅读 lint 输出、抑制警告、修复现有代码中的问题:从“解读输出”和“抑制 lint 警告”开始;大规模清理旧代码时使用并行子 Agent。
依赖项:
- golangci-lint:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Go Lint
概述
golangci-lint 是标准的 Go lint 工具。它将 100 多个 lint 工具整合到一个二进制文件中,并行运行这些工具,并提供统一的配置格式。开发期间应频繁运行,并始终在 CI 中运行。
每个 Go 项目都必须有一个 .golangci.yml — 它是启用哪些 lint 工具及其配置方式的唯一事实来源。生产环境就绪的配置启用了 48 个 lint 工具,请参阅推荐配置。
快速参考
# Run all configured linters
golangci-lint run ./...
# Auto-fix issues where possible
golangci-lint run --fix ./...
# Format code (golangci-lint v2+)
golangci-lint fmt ./...
# Run a single linter only
golangci-lint run --enable-only govet ./...
# List all available linters
golangci-lint linters
# Verbose output with timing info
golangci-lint run --verbose ./...
配置
推荐的 .golangci.yml提供了生产环境就绪的配置,包含 33 个 lint 工具。有关配置详情、lint 分类和各 lint 工具的说明,请参阅**lint 参考** — 了解各 lint 工具检查的内容(正确性、风格、复杂度、性能、安全性)、全部 33 个以上 lint 工具的说明,以及每个工具的适用场景。
抑制 Lint 警告
谨慎使用 //nolint 指令 — 请先修复根本原因。
// Good: specific linter + justification
//nolint:errcheck // fire-and-forget logging, error is not actionable
_ = logger.Sync()
// Bad: blanket suppression without reason
//nolint
_ = logger.Sync()
规则:
//nolint指令必须指定 lint 工具名称://nolint:errcheck,而不是//nolint//nolint指令必须附带说明注释://nolint:errcheck // reasonnolintlintlint 工具会强制执行上述两条规则 — 它会标记未指定 lint 工具名称的//nolint和缺少说明的指令- 绝不要在没有充分理由的情况下抑制安全 lint 工具(gosec、bodyclose、sqlclosecheck)
有关完整的模式和示例,请参阅**nolint 指令** — 了解何时抑制、如何撰写说明、逐行与逐函数抑制模式,以及反模式。
开发工作流
- 每次重要更改后都应运行 lint 工具:
golangci-lint run ./... - 尽可能自动修复:
golangci-lint run --fix ./... - 提交前格式化:
golangci-lint fmt ./... - 在旧代码库中逐步采用:在
.golangci.yml中设置issues.new-from-rev,仅对新增或更改的代码运行 lint,然后逐步清理旧代码
推荐的 Makefile 目标:
lint:
golangci-lint run ./...
lint-fix:
golangci-lint run --fix ./...
fmt:
golangci-lint fmt ./...
有关 CI 流水线设置(使用 golangci-lint-action 的 GitHub Actions),请参阅 samber/cc-skills-golang@golang-continuous-integration 技能。
解读输出
每个问题都遵循以下格式:
path/to/file.go:42:10: message describing the issue (linter-name)
括号中的 lint 工具名称表示是哪一个工具标记了该问题。请据此:
- 在参考文档中查找该 lint 工具,了解它会检查什么
- 如果是误报,请使用
//nolint:linter-name // reason抑制 - 使用
golangci-lint run --verbose获取更多上下文和耗时信息
常见问题
| 问题 | 解决方案 |
|---|---|
| "deadline exceeded" | 在 .golangci.yml 中设置或增加 run.timeout;golangci-lint v2 默认不设置超时(0) |
| 旧代码中问题过多 | 设置 issues.new-from-rev: HEAD~1,仅检查新代码 |
| 未找到 Linter | 检查 golangci-lint linters——Linter 可能需要更新的版本 |
| Linter 之间存在冲突 | 禁用较不实用的 Linter,并添加注释说明原因 |
| 升级后出现 v1 配置错误 | 运行 golangci-lint migrate 转换配置格式 |
| 大型仓库中运行缓慢 | 降低 run.concurrency,或使用 linters.exclusions.paths / formatters.exclusions.paths 排除路径 |
并行清理旧代码库
在旧代码库中采用 Lint 时,可使用最多 5 个并行子 Agent 同时修复互不相关的 Linter 类别:
- 子 Agent 1:运行
golangci-lint run --fix ./...,修复可自动修复的问题 - 子 Agent 2:修复安全 Linter 检查结果(bodyclose、sqlclosecheck、gosec)
- 子 Agent 3:修复错误处理问题(errcheck、nilerr、wrapcheck)
- 子 Agent 4:修复风格和格式问题(gofumpt、goimports、revive)
- 子 Agent 5:修复代码质量问题(gocritic、unused、ineffassign)
交叉引用
- → CI 流水线(使用 golangci-lint-action)请参阅
samber/cc-skills-golang@golang-continuous-integration技能 - → Linter 强制执行的风格规则请参阅
samber/cc-skills-golang@golang-code-style技能 - → 除 Lint 外的 SAST 工具(gosec、govulncheck)请参阅
samber/cc-skills-golang@golang-security技能 - → 使用这些指南在 CI 中进行自动化 AI 驱动代码审查,请参阅
samber/cc-skills-golang@golang-continuous-integration技能