golangci-lint 默认不显示源码上下文,需用 --print-issued-lines(轻量)或 -v(详细)启用;CI 中须配合 --out-format=github-actions 等平台适配格式才能实现跳转。

golangci-lint 默认不显示源码上下文,必须显式启用
默认运行 golangci-lint run 时,报错只显示文件名、行号、列号和文字描述,比如 main.go:12:5: SA1019: echo.Context.Value is deprecated——没有前后几行代码,根本看不出上下文里是不是在做类型断言、有没有 defer、有没有被包裹在 if 分支中。这不是 bug,是设计选择:为了速度和 CI 友好,默认关闭上下文渲染。
用 --print-issued-lines 或 -v 启用上下文输出
要看到实际触发告警的那行及前后代码,有两个等效方式:
-
golangci-lint run --print-issued-lines:只打印告警行本身(带高亮标记),最轻量 -
golangci-lint run -v:完整 verbose 模式,不仅显示告警行,还附带 linter 名称、配置来源、甚至 AST 节点位置(如ast.Node: *ast.CallExpr),适合调试规则行为
注意:--print-issued-lines 在 v1.57+ 才稳定支持;老版本只能靠 -v。如果用了 run.skip-dirs 跳过 docs/,上下文不会因此丢失——它只影响扫描范围,不影响已命中问题的展示逻辑。
CI 环境里想看上下文?别依赖 IDE 插件
很多团队误以为 GoLand 或 VS Code 的 golangci-lint 插件能自动补全上下文,其实它们只是把 CLI 输出原样渲染。真正在 CI 流水线(比如 GitHub Actions)里想让告警可读,得主动加参数:
- 在
.github/workflows/lint.yml中写成:run: golangci-lint run -v --out-format=github-actions -
--out-format=github-actions是关键:它把上下文行转成 GitHub 支持的::error file=...,line=...,col=...::格式,点击就能跳转到具体代码行 - 如果用 GitLab CI,换成
--out-format=gitlab-ci,效果类似
漏掉 --out-format,光加 -v 会导致 CI 日志刷屏但无法跳转——上下文有了,平台却认不出来。
自定义格式?用 --out-format=template + Go template
当标准格式不够用(比如想把 echo.Context.Get() 告警自动附上替换建议),可以用模板:
- 写一个
lint.tmpl文件,内容如:{{.FromLinter}}: {{.Text}} → 推荐改用 {{.Pos.Filename}}:{{.Pos.Line}}:{{.Pos.Column}} → c.Get("{{index .IssueText 1}}") - 执行:
golangci-lint run --out-format=template --template=@lint.tmpl
模板里 .IssueText 是字符串切片,SA1019 的提示通常形如 ["echo.Context.Value is deprecated", "user"],所以 index .IssueText 1 能取到 key 名。但注意:不同 linter 的 .IssueText 结构不一致,staticcheck 和 goconst 返回格式完全不同,不能无脑复用同一套模板。
上下文不是越多越好——-v 会暴露 AST 节点细节,对普通开发者反而干扰判断;真正该盯住的是告警行本身是否在合理语义位置,比如 c.Value("token") 出现在 middleware 里和出现在 test helper 里,修复优先级完全不同。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











