📌 项目地址:JetBrains/go-modern-guidelines | ⭐ 2,009 颗星 | 🔧 Go | 📜 未标注
📌 项目地址:JetBrains/go-modern-guidelines | ⭐ 2,009 | 语言:Go
问题真实存在
让 AI 写 Go,你大概率见过这样的输出:
if a > b {
return a
}
return b
而不是 max(a, b)。手写循环实现 slices.Contains,一串 nil 判断链而不是 cmp.Or(a, b, c)。
JetBrains 在这个仓库的 README 里给出了解释,两条原因:
训练数据滞后。 模型训练截止之后的新特性,它没见过。errors.AsType[T](err)(类型安全的错误匹配)和 new(42)(直接得到指向值的指针)都来自 Go 1.26,语料里没有,模型自然写不出来。
频率偏差。 就算模型知道某个特性,也倾向挑老写法。训练数据里 for i := 0; i < n; i++ 出现的次数远多于 for i := range n,输出分布就被带偏了。
这两条都不是猜测,是所有编码 agent 的通病。第一条只能等模型迭代,第二条短期无解——旧写法在语料里的存量太大。
仓库做了什么
核心是一份 SKILL.md,打包成 agent 可消费的 skill。装上后 agent 做三件事:
- 从
go.mod检测项目的 Go 版本 - 只使用该版本及之前的语言特性和标准库
- 在可用范围内优先选现代写法
覆盖 Go 1.0 到 Go 1.27,包括官方 modernize 分析器针对的全部特性。也就是说,即使项目锁在 Go 1.21,agent 也不会给你写出用不了的新 API。
和官方 modernize 的分工
Go 官方的 modernize 分析器负责把存量旧代码自动升级成新写法(README 引用了 Go 团队的演讲)。这个项目管另一头:让 agent 写新代码时就用对写法。一个治旧病,一个防新病。两者方向一致,都是 Go 团队认可的路线。
安装
支持 Junie、Claude Code、Codex、Cursor,其他 agent 走 skills.sh。以 Junie CLI 为例,在会话内执行:
/extensions marketplace add JetBrains/go-modern-guidelines
/extensions install modern-go-guidelines
之后遇到 Go 任务会自动触发 skill,不需要手动调用。更新用:
/extensions update modern-go-guidelines
Claude Code 等工具的具体命令,我拿到的 README 在此截断,直接看仓库原文。
两个前置条件
- 本机要有 Go 工具链且在 PATH 上。首次使用时,marketplace 集成会用
go install装一个小 CLI,装到本地缓存(如~/.cache/go-modern-guidelines),不改你的项目文件。 - CLI 目标环境是 Go 1.25 及以上。旧版本也能跑,前提是
GOTOOLCHAIN=auto(默认开启),首次运行会自动拉取兼容的工具链。
值不值得装
我的判断:这份 skill 里的操作——检测版本、查表、换写法——全是确定性操作,几乎没有出错空间。你常用 AI 写 Go,装上就有收益;项目锁死老版本 Go 或不用 AI 助手,可以跳过。
更值得留意的是它代表的思路。训练数据滞后和频率偏差不止影响 Go 一门语言,Rust、Java、Python 的新特性同样会被模型忽略。与其等模型迭代,不如把领域知识以 skill/rules 形式显式喂给 agent。这类项目会越来越多。