golangci-lint本身不统计代码行数,它仅作静态分析;行数需用tokei或loc等专用工具获取,且须排除test和vendor目录以保证准确性。

golangci-lint 本身不统计代码行数
它是个静态分析工具,不是代码度量工具。运行 golangci-lint run 或 golangci-lint lint 都不会输出 LOC(Lines of Code)、注释率、函数长度分布等指标——这些属于代码健康度的底层数据,它压根不采集。
如果你在 CI 里看到某处报告了“总行数”或“可维护性评分”,那一定是额外集成了别的工具,比如 gocyclo、goconst、dupl 等插件只负责各自领域(圈复杂度、重复字面量、重复代码),但依然不提供整体行数。
用 loc 或 tokei 快速查 Go 项目总行数
真正轻量、准确、Go 友好的行数统计,推荐用 tokei(Rust 写的,快且支持多语言)或 loc(Go 写的,更小更简单)。两者都默认排除 vendor/、test 文件(如 *_test.go),符合常规统计口径。
- 安装
tokei:cargo install tokei(需 Rust 环境),或直接下载二进制 - 统计当前项目:
tokei ./...,会分文件类型给出Code、Comment、Blank行数 - 只看 Go 代码(不含测试):
tokei --exclude "*_test.go" . - 用
loc更省事:go install github.com/whilp/loc@latest,然后loc ./...
注意:别用 wc -l **/*.go 这类 shell 组合——它会把 test 文件、vendor 里的第三方代码全算进去,结果虚高 2–5 倍很常见。
立即学习“go语言免费学习笔记(深入)”;
健康度要看具体指标,不是“一个分数”
所谓“代码健康度”,在 Go 工程中其实是多个独立信号的组合:
-
gocyclo:函数圈复杂度 >10 就该拆,>15 基本要重构 -
goconst:重复字符串字面量超过 3 次,说明缺常量或配置抽象 -
gosimple+staticcheck:能发现过时 API、无用变量、低效写法(比如strings.Replace用错参数) -
revive(可选):比内置 linter 更细的风格检查,比如错误返回顺序、context 使用规范
这些都要显式启用。例如在 .golangci.yml 里加:
linters-settings:
gocyclo:
min-complexity: 10
goconst:
min-len: 3
min-occurrences: 3
没配就等于没用——golangci-lint 默认只开最保守的几个 linter。
CI 中串联行数 + 健康度,得靠脚本 glue
想在 PR 流水线里同时展示“本次变更新增 87 行,修复 2 个 high 级问题”,不能指望 golangci-lint 自己吐出数字。得自己写点胶水逻辑:
- 先跑
tokei --json | jq '.Go.Code'提取主代码行数 - 再跑
golangci-lint run --out-format=json | jq 'length'统计问题总数(或按 severity 过滤) - 把两个结果拼进 Slack / GitHub comment,或写入
report.json供后续分析
最容易被忽略的一点:不同环境(本地 / CI / Docker)下,./... 匹配路径可能因 .gitignore 或挂载方式不同而漏文件。建议固定用 $(git ls-files '*.go' | grep -v '_test\.go$') 生成白名单,再喂给 tokei 或 golangci-lint。


















