装完golangci-lint后默认仅启用govet和errcheck,staticcheck、unused、revive等关键检查器必须通过同级go.mod目录下的.golangci.yml显式启用,否则无法发现弃用api、死循环、未使用符号等问题。

用 golangci-lint 扫出不规范代码,但别只信默认配置
装完 golangci-lint 后直接跑 golangci-lint run,大概率什么也不报——它默认只开 govet 和 errcheck,连 staticcheck 这种揪弃用 API、死循环的主力都关着。不配 .golangci.yml 就等于没装。
必须手动启用的核心 linter 有这五个:govet(类型/作用域问题)、errcheck(忽略 error)、staticcheck(SA 类高危警告)、unused(未使用符号)、revive(可配规则替代已弃用的 golint)。其他像 dupl 或 lll 建议关掉,前者误报多,后者纯属风格偏好。
配置文件必须和 go.mod 在同一级目录,命名必须是 .golangci.yml(不是 .yaml),多 module 项目每个 module 都得单独放一份。
定位具体哪行代码违规,看清楚 nolint 是真必要还是偷懒
//nolint 不是免死金牌,滥用会掩盖真实问题。常见错误包括:
- 在文件顶部写
//nolint却没加具体 linter 名,结果把errcheck也绕过了,导致关键 error 被静默丢弃 - 用
//nolint:gosimple忽略一个本该用strings.TrimSpace替代strings.Trim的简化建议,却漏掉了更严重的staticcheck报警 - 生成代码(如
*_gen.go)没进exclude-files,被反复检查拖慢 CI
正确做法是:先确认违规是否真实合理;如果是生成代码或兼容性适配,用 exclude-files 正则统一排除;如果只是某一行例外,精确写 //nolint:errcheck,别全禁。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
go list -m all + grep 看见“可疑包”,再人工查 pkg.go.dev
依赖树里藏着大量不规范代码的温床,比如长期不更新、作者弃坑、fork 自非官方分支的模块。光靠 linter 扫不到这些。
执行 go list -m all | grep -E "(golang\.org/x|github\.com/.*\.(sql|http|crypto))",快速筛出高频风险模块。对每个命中项:
- 访问
pkg.go.dev/模块路径,看 “Last updated” 是否超过 6 个月 - 点进源码仓库,检查 Open issues 数量、最近 commit 时间、是否有安全相关 issue 被关闭
- 运行
go mod graph | grep 模块名,确认它是被谁引入的——如果是测试专用依赖(// indirect且只在_test.go里用),线上虽不执行,但 CI 下载时仍可能带入漏洞
特别注意 golang.org/x/net 和 golang.org/x/text:它们被标准库周边包大量间接依赖,但 govulncheck 对其子功能覆盖不全,得靠人工盯。
CI 中跑 go vet 和 golangci-lint,但别让 go mod verify 掉链子
本地能过不代表 CI 安全。两个关键卡点必须进流水线:
-
go mod verify放第一行:它比对本地go.sum和sum.golang.org公共日志里的哈希,防中间人污染。失败就中断,不能跳过 -
golangci-lint run --config=.golangci.yml --timeout=2m --concurrency=2:加--timeout防 hang,--concurrency控资源,否则 CI 常因争抢 vCPU 超时
容易被忽略的是:go.sum 文件必须提交 Git,且每次 go mod tidy 后要人工确认新增条目——比如突然多了个 github.com/xxx/yyy@v0.0.1,得查清是不是你团队内部库,还是被恶意 proxy 换包了。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










