
golangci-lint Linters 全览用help linters与linters命令掌握内置检查器的启用与分类【免费下载链接】golangci-lintFast linters runner for Go项目地址: https://gitcode.com/gh_mirrors/go/golangci-lintgolangci-lint 是面向 Go 的快速 linter 运行器Fast linters runner for Go它聚合了上百个社区与官方静态检查器。本文以官方文档 Linters 概览页 为核心骨架系统讲解如何通过golangci-lint help linters与golangci-lint linters两条命令查看全部内置 linter、默认启用集合以及当前配置生效的集合并结合 pkg/commands/help_linters.go、pkg/commands/linters.go 与 pkg/lint/lintersdb/manager.go 等源码讲清底层分组、默认值与配置解析原理。读完本文你将能快速审计任意项目当前启用了哪些检查器、哪些默认关闭并据此精准调整自己的 linter 组合。文档定位Linters 入口页在站点中的角色在官方文档站点中docs/content/docs/linters/_index.md 是 “Linters” 章节的索引页front matter 中weight: 3、excludeSearch: true并带有aliases: /usage/linters/历史别名。它本身不罗列全部检查器的细节而是承担三个职责给出两条最核心的 CLI 命令快速获取 linter 清单通过卡片导航指向 Quick Start、CLI、全局配置、Linter 设置等关联文档通过站点短代码shortcode渲染“全部 Linter”列表并提供 Default / New / Autofix / Fast / Slow / Deprecated 过滤徽章。也就是说这篇索引页是“查看与理解 linter 集合”的操作总入口。下文围绕它展开的每一条命令与机制都能在仓库源码中找到对应实现。快速上手两条命令看全所有 linter命令一golangci-lint help linters—— 查看支持列表与默认启用状态文档给出的第一条命令用于查看“支持哪些 linter以及哪些默认启用/禁用”golangci-lint help linters该命令由 pkg/commands/help.go 中的helpCommand注册lintersCmd.Use lintersShort为 “Display help for linters.”实际执行逻辑在 pkg/commands/help_linters.go。关键实现细节help_linters.go#L50-L68lintersPreRunE中直接以config.NewDefault()构造 linters 数据库管理器lintersdb.NewManager(...)注释明确说明“该命令不依赖真实配置”The command doesnt depend on the real configuration因此它展示的是全量支持清单 默认分组与用户自己的.golangci.yml无关输出时按lc.FromGroup(config.GroupStandard)判断属于standard组的 linter 归入“Enabled by default linters”绿色标题其余归入“Disabled by default linters”红色标题见 help_linters.go#L90-L113每个 linter 条目由printLinters渲染为名称: 描述 [能力]形式能力标记包括蓝色fast非慢速与绿色auto-fix支持自动修复已废弃的 linter 会追加红色[deprecated]标记且排序时被统一放到列表末尾见 help_linters.go#L115-L155。该命令还支持--json输出便于脚本化消费help_linters.go#L72-L88JSON 中每个 linter 包含name、description、groups、fast、autoFix、deprecated、since、originalURL等字段。例如想拿到所有“快速”linter 的名字可配合 jq 处理golangci-lint help linters --json | jq [ .[] | select(.fasttrue) ] | map(.name)这条 jq 用法并非杜撰它在 docs/data/configuration_file.json 中linters.default字段的官方注释里被原样引用用于说明fast分组的确切构成。命令二golangci-lint linters—— 查看当前配置实际启用的集合文档给出的第二条命令用于查看“你的配置启用了哪些 linter”golangci-lint linters与help linters不同linters命令会加载真实配置。其实现位于 pkg/commands/linters.gopreRunElinters.go#L71-L88通过config.NewLintersLoader(...)加载配置文件与命令行 flag含--config相关 flag随后以加载后的配置构造lintersdb.NewManager(...)executelinters.go#L90-L136调用dbManager.GetEnabledLintersMap()得到最终启用的 linter 集合再与全量支持列表比对划分为“Enabled by your configuration linters”与“Disabled by your configuration linters”两组输出同样支持--jsonfs.BoolVar(c.opts.JSON, json, ...)此时输出结构为{Enabled: [...], Disabled: [...]}。因此help linters回答的是“这个版本支持什么”而linters回答的是“我这个项目现在跑哪些”。前者适合了解工具能力边界后者适合排障、审计 CI 配置、确认某条规则是否真的在生效。默认 linter 分组与linters.default配置语义两条命令输出的背后是 pkg/config/linters.go 定义的四组预置分组常量const ( GroupStandard standard GroupAll all GroupNone none GroupFast fast )对应配置文件linters.default字段的可选值见 docs/data/configuration_file.json 中linters段的官方注释与示例standard默认值启用文档所称的 “Default” linter 集合即所有被打上standard组标记的检查器all默认启用全部 linternone默认不启用任何 linter此时仅保留不可禁用的typecheckfast只启用被标记为 “fast”非慢速的检查器。分组解析逻辑位于 pkg/lint/lintersdb/manager.go#L131-L205 的build()方法第 136 行groupName : cmp.Or(m.cfg.Linters.Default, config.GroupStandard)表明未显式配置linters.default时默认值即standardGroupStandard分支仅筛选lc.FromGroup(config.GroupStandard)的 lintermanager.go#L157-L167这也是help linters中 “Enabled by default” 一组的直接判定依据GroupFast分支通过lc.IsSlowLinter()排除慢速 lintermanager.go#L145-L155随后按顺序应用linters.enable追加、linters.disable剔除支持别名见注释 “its important to use lc.Name() nor name because name can be alias”manager.go#L173-L185若启用了linters.fast-only仅 flag 选项见 pkg/config/linters.go#L19再统一移除慢速 linter最后强制补入typecheck——它不是真正的 linter 且不可禁用manager.go#L196-L202所以你在任何配置下都会看到它。一个典型配置片段对照 docs/data/configuration_file.json 的示例字段linters: # 默认集standard / all / none / fast # Default: standard default: standard # 在默认集基础上额外启用 enable: - revive - gocritic - staticcheck # 从结果中剔除 disable: - errcheck注意一个容易踩的坑linters.enable/linters.disable中不能出现格式化器formatter如gofmt、gofumpt、gci、goimports、golines、swaggo。pkg/config/linters.go#L41-L49 的validateNoFormatters会在配置校验阶段直接报错 “%s is a formatter”。格式化器需要放到独立的formatters:配置段中管理。“所有 Linter”列表与站点过滤徽章文档索引页的 “All Linters” 部分通过 Hugo 短代码渲染完整列表{{ golangci/items/filter }} {{ golangci/items/filter-badge datadefault contentDefault }} {{ golangci/items/filter-badge datanew contentNew }} {{ golangci/items/filter-badge dataautofix contentAutofix }} {{ golangci/items/filter-badge datafast contentFast }} {{ golangci/items/filter-badge dataslow contentSlow }} {{ golangci/items/filter-badge datadeprecated contentDeprecated }} {{ /golangci/items/filter }} {{ cards }} {{ golangci/items/cards pathlinters datalinters_info }} {{ /cards }}列表数据源是 docs/data/linters_info.json共 1100 行每个条目包含name、desc、originalURL、internal、isSlow、since、canAutoFix、groups等字段。例如前几条arangolint面向 arangodb client 的约定检查器isSlow: true自 v2.2.0 起支持asciicheck检查代码标识符是否含非 ASCII 字符isSlow: false快自 v1.26.0 起支持canonicalheader检查net/http.Header是否使用规范头部带canAutoFix: true自 v1.58.0 起支持。这些字段与help linters --json输出的fast、autoFix、deprecated、since等标记一一对应也与linters_info.json中isSlow、canAutoFix直接映射——站点徽章过滤与 CLI 能力标记本质上是同一份数据的两套呈现。各徽章语义可对照 CLI 输出理解站点徽章含义对应数据/代码依据Default属于standard分组默认启用groups含standardmanager.go 的GroupStandard分支New较新版本加入since字段如 v2.x 系列Autofix支持自动修复canAutoFix字段help_linters.go 的auto-fix标记Fast非慢速检查器isSlow: false!lc.IsSlowLinter()判定Slow需要完整程序加载/较慢isSlow: truelc.IsSlowLinter()Deprecated已废弃仍可用但有告警IsDeprecated()判定从数据到运行linter 的注册与执行优化理解列表之后值得看一眼这些 linter 是如何被“组织起来”的。仓库中 pkg/lint/lintersdb/ 目录是 linter 的“数据库”实现builder_linter.go内置 linter 的构建器其中多个 linter 通过WithGroups(config.GroupStandard)挂入 standard 分组如 builder_linter.go#L232、#L434、#L461 等builder_plugin_go.go与builder_plugin_module.go支持通过 Go 插件plugin 模块扩展第三方 linter扩展的 linter 也可加入 standard 组builder_plugin_go.go#L72manager.goManager是“所有 linter内置或插件的数据库”提供GetAllSupportedLinterConfigs()、GetEnabledLintersMap()等访问方法manager.go#L25-L34。从源码结构还可以看到运行期的一项关键优化GetOptimizedLinters()manager.go#L96-L128会把多个可增量加载的 go/analysis linter 合并进一个 metalintercombineGoAnalysisLintersmanager.go#L207-L261通过共享一次加载的数据来提升速度——这也是项目“Fast linters runner”定位在实现层面的体现。需要注意的是整程序加载模式goanalysis.LoadModeWholeProgram的 linter 不参与合并因为“同时运行 whole-program 与增量分析器在 CPU 与内存上都不划算”manager.go#L218-L221。常见排查场景与操作建议把上面两条命令组合起来可以覆盖几类高频需求审计项目当前启用的检查器运行golangci-lint linters检查 “Enabled by your configuration linters” 是否与预期一致确认误启/漏启判断某个新 linter 是否可用运行golangci-lint help linters | grep name确认名称、能力标记fast/auto-fix与[deprecated]状态在 CI 中做断言用golangci-lint linters --json解析Enabled/Disabled数组与团队规范比对按性能取舍用golangci-lint help linters --json筛选fasttrue的子集或直接在配置中设置linters.default: fast/ 追加--fastflag在开发迭代期快速反馈。无论选择哪条命令最终配置入口都在linters:配置段pkg/config/linters.go 定义了default、enable、disable、fast-only、settings、exclusions等字段完整的示例字段与注释可查阅 docs/data/configuration_file.json 中的linters条目或站点中与之关联的 Linter 设置文档。总结golangci-lint help linters与golangci-lint linters是掌握 golangci-lint 检查器生态的两个抓手前者基于默认配置输出全量支持清单与默认启用状态后者加载你的真实配置输出实际生效集合。二者背后是standard/all/none/fast四组默认分组pkg/config/linters.go与 pkg/lint/lintersdb/manager.go 中build()的解析顺序——先取默认组再应用enable/disable最后强制保留typecheck。借助--json输出你可以把 linter 集合的审计工作完全脚本化持续守护项目的代码质量基线。【免费下载链接】golangci-lintFast linters runner for Go项目地址: https://gitcode.com/gh_mirrors/go/golangci-lint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考