使用 Junie 和 Claude Code 编写现代 Go 代码
Go 开发者现在可以使用 AI 智能体 Junie 和 Claude Code 自信地编写现代 Go 代码。我们在 JetBrains 刚刚发布了一个新插件,其中包含针对 AI 智能体的指南,确保它们使用最新功能并遵循最佳 Go 实践,且与 go.mod 中指定的当前 Go 版本兼容。您可以在 go-modern-guidelines 找到相关的 GitHub 仓库。
为什么需要它?
Go 每年发布两个主要版本,是更新较为频繁的语言之一。然而我们发现,所有 AI 智能体——包括 Junie 和 Claude Code——都倾向于生成过时的 Go 代码。
Go 团队也在其中一篇文章中指出了这个问题:“在 LLM 编码助手被疯狂采用的浪潮中,我们意识到这些工具——毫不奇怪——倾向于生成与训练时使用的大量 Go 代码风格相似的代码,即使有更新、更好的方式来表达同一个想法。”
例如,以下代码片段展示了智能体如何使用手动循环在切片中查找元素:
在有更简洁、更地道的解决方案可用的情况下,智能体仍倾向于使用过时架构,主要有两个原因:
- 数据截止:即使是最新的 AI 模型,也是在有时间限制的数据集上训练的,这些数据集都有一个“截止”日期(例如,对于 Claude Opus 4.6,截止日期是 2025 年 5 月)。它们不会识别或建议在该日期之后引入的功能,例如 Go 1.26 版本中的功能。
- 频率偏差:AI 模型主要在可能未及时更新的开源代码库上进行训练。这些数据集中自然会包含比“新”代码更多的“旧”代码,而且由于 AI 模型倾向于选择频率更高的选项,因此它们会建议过时的代码。
就像 Go 团队一样,我们 GoLand 团队也致力于保持 Go 生态系统的现代化和地道。为了减轻 AI 智能体加剧这一问题的负面影响,我们创建了一个插件,其中包含一套针对 Junie 和 Claude Code 的指南,帮助它们生成现代 Go 代码。该插件会自动识别您当前的 Go 代码版本(在 go.mod 中指定),并指示智能体使用相应的功能,例如使用 new(val) 代替 x := val; &x,或者使用 errors.AsType[T](err) 代替 errors.As(err, &target)(这两者均在 Go 1.26 中引入),以及该版本及之前版本中可用的标准库新增功能。
以下是应用了我们的指南后的相同代码示例,智能体实际上使用了 Go 1.21 中引入的现代 slices.Contains() 方法。
如何启用
在 Junie 中
对于 Junie 版本 2xx.620.xx 或更高版本,您无需执行任何操作——这些指南将自动开箱即用。
如果您运行的是旧版本,请转到 设置 → 插件 → 已安装,找到 Junie,然后点击 更新。
如果出于某种原因您想禁用这些设置,可以在 设置 → 工具 → Junie → 项目设置 → Go 中进行操作。提供现代 Go 指南 选项默认处于启用状态,因此请取消勾选该框。
在 Claude Code 中
要在 Claude Code 中使用这些指南,请在 Claude Code 会话中运行以下命令进行安装。
将此仓库添加为市场源:
安装插件:
要激活它,请在会话开始时运行以下命令:
然后,Claude Code 将从 go.mod 检测 Go 版本,并指示智能体使用与该版本兼容的现代功能。
在此之后,智能体编写的任何 Go 代码都将遵循这些指南。
祝您编码愉快!
GoLand 团队