errcheck必须显式启用,否则默认不检查error忽略;需在.golangci.yml中加入enable: - errcheck,且配置文件名、路径及CI调用参数均须正确,它不支持--fix自动修复。

errcheck 必须显式启用,否则不检查 error 忽略
装完 golangci-lint 后直接跑 golangci-lint run,errcheck 默认是关闭的。它不会报 os.Remove("x") 没处理错误、json.Unmarshal 返回 err 被丢弃这类问题——除非你在 .golangci.yml 里明确写进 enable 列表。
常见误配:
- 只留默认配置,以为“装了就查 error”,结果上线后因未处理
io.Copy错误导致静默失败 - 在
disable里写了["golint"],却没配enable,导致整个 linter 集回落到极简默认集(仅govet、errcheck等约 10 个),但errcheck实际仍被跳过(因为默认集不含它)
正确做法是统一用 enable 显式声明:
linters:
enable:
- errcheck
- govet
- staticcheck
测试文件里 errcheck 会误报,必须单独调低敏感度
golangci-lint 默认跳过 _test.go,即使你启用了 errcheck,它也不会检查测试代码里的 t.Fatal、log.Fatal 或 require.NoError 是否掩盖了真实错误。但一旦你加了 --tests 参数并清空 skip-files,errcheck 就会开始报错:比如 t.Fatal(err) 被标为“未检查错误返回值”——这显然不合理。
解决方法不是关掉 errcheck,而是限制它只检查导出函数:
linters-settings:
errcheck:
check-exported: false
或者更精准地排除测试常用函数:
linters-settings:
errcheck:
exclude-functions:
- "t\.Fatal"
- "t\.Fatalf"
- "require\..*"
- "assert\..*"
errcheck 不修复代码,只提示,别指望 --fix 自动补 err
golangci-lint run --fix 对 errcheck 完全无效——它压根不支持自动修复。报出 unused result of call to os.Open 后,工具不会帮你加 if err != nil { t.Fatal(err) } 或 _, err := os.Open(...)。
原因很实在:是否该 panic、该 log、该 return 还是该忽略,取决于上下文语义,机器无法安全决策。所以:
- 别在 CI 脚本里加
--fix试图“一键修 error 忽略” - 本地开发可配合 IDE(如 GoLand 的 quick-fix)手动补,但得人工判断分支逻辑
- 若想自动化补基础 error 处理,得另起脚本或用
goast类工具,golangci-lint不负责这事
CI 中 errcheck 失效,大概率是 --config 没传或路径错了
本地 golangci-lint run 看起来正常,CI 却完全不报 errcheck 错误?八成是配置根本没加载。它不会警告“找不到配置”,而是安静退回到默认启用集(不含 errcheck)。
必须确认三件事:
-
.golangci.yml文件名严格为点开头 +yml小写,不能是.golangci.yaml或golangci.yml - 该文件与项目
go.mod在同一目录;monorepo 中每个 module 都要单独放一份 - CI 脚本中必须显式写
golangci-lint run --config=.golangci.yml,不能只写golangci-lint run
漏掉任何一项,errcheck 就等于不存在。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











