AI 编程助手写 Go 为什么总用过时语法?JetBrains 官方的解法是给 Agent 装一份现代 Go 规范
不是逻辑错,不是语义错,而是——用的都是三五年前的写法。
for i := 0; i < n; i++ 而不是 for i := range n;err == target 而不是 errors.Is(err, target);interface{} 而不是 any。模型知道这些新写法,但在浩如烟海的旧代码训练数据里,老模式出现频率实在太高,它本能地就选旧不选新。
这个问题,JetBrains 决定正式出手解决。
官方下场:给 AI 编程 Agent 写一份 Go 现代规范
JetBrains 一个月前在 GitHub 上开源了 go-modern-guidelines,目前已收获 2,873 颗星。它的目标非常明确:让 AI 编程助手从写第一行代码开始就用现代 Go,而不是写完再让 linter 去修。
和普通 linter 不同,这套指南是”生成时干预”而非”写完后检查”。它不是一个静态分析工具,而是一组可供 AI agent 直接调用的规则集,告诉你”这个场景该用什么现代写法”。
具体怎么工作的?以一个真实例子来看——
开发者 Petr 有一份 1039 行的 main.go,他让 AI 在 go-modern-guidelines 辅助下做重构。工具首先从 go.mod 读取项目的 Go 版本,然后给出适用于该版本的规则清单,比如:
- 用
cmp.Or(os.Getenv("NAME"), "default")代替一串 nil 检查 - 用
slices.Contains(items, x)代替手动循环查找 - 用
for i := range n代替传统for i := 0; i < n; i++
AI 选用了其中 6 条相关规则做了重构,代码现代性显著提升。这不是 AI 自己的判断,而是指南明确告诉它该怎么写。
覆盖范围:从 Go 1.0 到 Go 1.27
这份指南涵盖了 Go 1.0 到 Go 1.27 每个版本最有用的语言特性,包括 Go 官方 modernize analyzer 所涉及的所有改造路径。具体来说,指南会引导 AI 使用:
| 场景 | 旧写法 | 现代写法 | 起始版本 |
|---|---|---|---|
| 取非零默认值 | if-else 链 | cmp.Or(a, b, c) |
Go 1.22 |
| 切片包含判断 | 手动 for 循环 | slices.Contains(s, x) |
Go 1.21 |
| 字符串切分 | strings.Index + 切片 |
strings.Cut(s, sep) |
Go 1.18 |
| 错误类型匹配 | 类型断言 | errors.AsType[T](err) |
Go 1.26 |
| 字面量指针 | &Value{} |
new(Value) |
Go 1.26 |
| 并行任务 | wg.Add() + go + wg.Done() |
sync.WaitGroup.Go() |
Go 1.24 |
| 字符串裁切 | strings.TrimSuffix |
strings.CutSuffix |
Go 1.27 |
关键设计细节:指南分为两层——list 给出所有适用规则的一行摘要(约 45 条共 ~1000 tokens),explain 提供单条规则的详细说明和 before/after 示例。AI agent 先用 list 扫全部规则,再对相关规则调用 explain 获取详解,最大化节省上下文窗口。
还有一个容易被忽略的陷阱:指南在 cmp.Or 的说明里特别提到”所有参数在调用前都会被求值”——这意味着 cmp.Or(a(), b()) 会同时执行 a() 和 b(),不只是返回第一个非零值。这种”知道代价才能用对”的提醒,比简单告诉 AI 换语法要实用得多。
谁该用,谁该等
适合用:
- 团队里所有人都在用 Claude Code、Cursor、Copilot 等 AI 编程助手写 Go
- 需要确保 AI 生成代码符合项目所使用 Go 版本的语法规范
- 希望从源头减少”代码写完再让 linter 修”的来回成本
不太需要:
- 纯手工写 Go、不依赖 AI 助手的开发者(这类人更需要的是 Effective Go 和 gofmt)
- 项目仍在用 Go 1.18 以下版本(很多现代特性无法享用)
支持哪些 AI Agent?
JetBrains 为主流 AI 编程助手都做了集成:
- Claude Code:插件市场安装,两行命令激活(
/plugin marketplace add JetBrains/go-modern-guidelines+/plugin install modern-go-guidelines) - Junie:内置支持,GoLand 2026.1+ 默认启用
- Cursor / Codex / OpenCode:通过
npx skills add JetBrains/go-modern-guidelines安装 - 其他 Agent:同样可通过 skills.sh 接入
首次运行时,CLI 会自动通过 go install 安装到本地缓存目录(~/.cache/go-modern-guidelines),不修改项目任何文件。需要 Go 1.25+ 环境,但 GOTOOLCHAIN=auto(默认开启)时 Go 可以自动下载兼容版本。
一个值得关注的方向
linter 只能告诉你代码错了,告诉你该怎么改;但 linter 不能在你写之前就告诉你该用什么写法。go-modern-guidelines 填补的正是这个空白——它是一套发生在代码生成之前的质量门禁。
这个思路有可能成为未来 AI 编程工具链的标准配置。想象一下,不只是 Go,Python 有 Modern Python Guidelines、Rust 有 Modern Rust Guidelines……每种语言都有一份由官方维护的”AI 编程规范”,让 AI 生成代码从一开始就符合业界最新共识,而不是带着大量技术债入库。
JetBrains 已经开了这个头。GitHub 上相关讨论和 issue 里,有不少开发者提议把这个模式迁移到其他语言——Python、Kotlin、Java 都在候选列表里。
下一步建议
如果你的团队在用 AI 编程助手写 Go,可以立即尝试:
第一步:在 Claude Code 中安装插件
/plugin marketplace add JetBrains/go-modern-guidelines
/plugin install modern-go-guidelines
/use-modern-go
第二步:用 go-modern-guidelines list --file-path <your_file.go> 扫描一个现有 Go 文件,看看 AI 原本会生成哪些过时模式
第三步:把 /use-modern-go 加入团队 AI 编程的标准化启动流程,从新代码开始杜绝旧写法
项目地址:https://github.com/JetBrains/go-modern-guidelines
官方介绍博客:Help AI Coding Agents Write Up-To-Date Code With Modern Golang Skills(2026-08-24)
评论区
登录后可评论。