📌 项目地址: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。这类项目会越来越多。

这篇文章对你有帮助吗?

发表回复