默认会检查测试文件,golangci-lint 不区分 _test.go,只要被 go list 识别为包成员即参与 lint;可通过 --skip-files '._test.go' 跳过全部测试文件,或用 exclude-rules 按规则精细控制。

golangci-lint 默认是否检查测试文件?
默认会检查,golangci-lint 不区分 *_test.go 文件,只要在当前模块路径下、被 go list 识别为包成员,就会参与 lint。这不是 bug,是设计行为——有些规则(如 dupl、goconst)确实需要覆盖测试逻辑来发现重复或硬编码问题。
但多数场景下,你只想对生产代码严格把关,测试文件可以放宽或跳过。
通过 --skip-files 跳过所有 *_test.go
最直接的方式是在命令行中用正则排除:
golangci-lint run --skip-files '.*_test\.go'
注意:
-
--skip-files接收 Go 正则(regexp包语法),不是 glob - 点号
.需转义为.,否则匹配任意字符 - 开头的
.*是必须的,因为完整路径可能含目录前缀(如pkg/http/handler_test.go) - 这个参数只影响文件级跳过,不改变包解析逻辑
也可以写进配置文件(.golangci.yml)里:
run:
skip-files:
- '.*_test\.go'
用 --exclude-use-default=false + exclude-rules 更精细控制
如果你不想完全跳过测试文件,而是仅关闭部分“对测试不友好”的规则,比如:
-
exhaustruct(强制字段初始化)在测试中常故意留零值 -
errcheck(忽略错误返回)在 setup/teardown 中常见 -
goerr113(错误变量命名)测试里用err很自然
可以这样配:
linters-settings:
errcheck:
check-type-assertions: false
check-blank: false
exhaustruct:
enabled: false
<p>issues:
exclude-rules:</p>
- path: '.*_test.go'
linters:
- 'exhaustruct'
- 'errcheck'
- 'goerr113'
关键点:
-
exclude-rules比skip-files更灵活:同一文件可对不同 linter 应用不同策略 -
path字段仍需正则,且匹配的是相对路径(从 module root 开始) - 规则禁用只在 issue 层生效,linter 本身仍会运行(只是不报告匹配项)
为什么 .golangci.yml 里 exclude-rules 不生效?
常见原因有三个:
- 正则写成
_test.go(缺少.前缀和转义),实际应为.*_test.go -
path匹配的是相对于go list输出的包路径,不是当前工作目录;如果在子目录执行golangci-lint run ./...,而配置写在根目录,路径仍以 module root 为基准 - 某些 linter(如
govet)自身不支持 per-file 排除,exclude-rules对它无效,只能靠skip-files或--skip-dirs
测试是否生效,加 -v 看日志:
golangci-lint run -v | grep 'excluded by rule'
如果没输出,说明正则没命中,或者规则未加载。
跳过测试文件这事看似简单,但正则写错、路径理解偏差、linter 自身限制这三点最容易卡住人。尤其是混合使用 skip-files 和 exclude-rules 时,得先确认你想跳的是「整个文件」还是「某些检查」——选错方式,后面调半天都白搭。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











