Ohhnews

分类导航

$ cd ..
Jetbrains Blog原文

JetBrains发布Modern Go Guidelines:让AI编程助手写出更现代的Go代码

#go语言#ai编程助手#代码现代化#jetbrains#开源工具

TL;DR

  • GitHub 仓库Modern Go Guidelines
  • 目的:Modern Go Guidelines 是一组技能,帮助 AI 编程智能体编写更新颖的 Go 代码,使其与你项目中的 Go 版本匹配。
  • 版本支持:这些技能涵盖 Go 1.0 至 Go 1.27 中实用的语言特性和标准库新增功能。当你的项目使用较旧版本时,会排除更新版本的指南。
  • 聚焦上下文:该工具使用 list 提供简短指南,使用 explain 提供详细示例。这种渐进式披露方式只在智能体需要时提供详细指导,帮助其更可靠地应用这些技能。
  • 安装:你可以从插件市场或本地仓库安装该插件。该集成需要 Go 工具链,运行于本地缓存中,并且不会修改你的项目。

为什么 AI 编程智能体需要现代 Go 技能

AI 编程智能体能够生成可运行的 Go 代码,但它们通常依赖过时的模式。较旧的语法在其训练数据中出现得更频繁。较新的语言特性和标准库新增内容也可能超出其训练截止时间。

GoLand 团队创建了 Modern Go Guidelines 来弥补这一差距。这些 Go 技能为智能体提供了编写现代代码的最新参考。它们帮助智能体选择你项目中 Go 版本所支持的特性,避免使用需要更新版本的代码。

Modern Go 技能是 GoLand 团队对更广泛 Go 社区的开源贡献。你可以在终端中与受支持的 AI 编程智能体一起使用这些技能。

为正确的 Go 版本编写现代代码

更新的代码只有在你的项目能够编译时才有用。因此,这些指南与你 go.mod 文件中声明的 Go 版本保持一致。

假设一个项目包含 go 1.25 指令。

该智能体可以获得 Go 1.25 及更早版本的技能。它不会获得 Go 1.26 或 Go 1.27 的技能。例如,它可以学会使用 Go 1.25 引入的 sync.WaitGroup.Go。它不会收到使用 errors.AsType 的建议,因为该特性需要 Go 1.26。

这种版本检查可确保生成的代码与你的项目兼容。同时,它还减少了智能体必须读取的上下文量。智能体不会在不支持使用的特性上消耗 token。

聚焦输出的 CLI 工具

该智能体使用随 go-modern-guidelines 插件提供的 CLI 工具。它包含 use-modern-go 技能,即一组教智能体何时以及如何使用 CLI 的指令。该工具支持两个主要子命令:listexplain。该技能会告诉智能体在编辑前针对相关 Go 文件运行 list,并在需要了解特定规则的详细信息时调用 explain

每种智能体集成都通过自己的包装器运行这些子命令。下面的示例使用 CLI 二进制文件名。

你的智能体使用 CLI 来获取与你项目中使用的 Go 版本对应的技能。list 子命令返回简短、相关的指南。当智能体需要更多上下文时,explain 子命令提供详细的指导和代码示例。

go-modern-guidelines list --file-path ./internal/worker/worker.go

你的智能体也可以直接设置版本:

go-modern-guidelines list --go-version 1.27

输出从最新适用的指南开始,并为每条指南提供一个稳定的标识符(ID):

...
sync_waitgroup_go: Use wg.Go when spawning goroutines tracked by a sync.WaitGroup.
testing_t_context: Use t.Context() when a test function needs a context tied to the test lifetime.
json_omitzero: Use omitzero on JSON-tagged bool, numeric, struct, and time fields whose zero value should be omitted; keep omitempty for empty strings, slices, and maps.
...

这种简短输出帮助智能体找到相关指南,而无需加载所有可用的解释和代码示例。

智能体可能无法识别较新的 Go 特性,或不知道如何应用它,因为该特性超出其训练数据范围。当智能体需要关于某条指南的更多信息时,它会使用 explain 子命令。

go-modern-guidelines explain generic_methods

该命令返回详细解释以及一个“前后对比”示例。示例将旧模式与其现代替代方案进行比较,帮助智能体正确应用更改。

generic_methods:
  Since: Go 1.27

  Summary:
    Use generic methods instead of package-level generic helper functions when the operation naturally belongs to the type itself.

  Details:
    Generic methods keep operations in the namespace of the type that owns them. Keep package-level helpers for operations that do not naturally belong to one receiver type.

  Examples:

  Before:
    type Set[T comparable] map[T]struct{}
    func Map[T comparable, U any](s Set[T], f func(T) U) []U {
      out := make([]U, 0, len(s))
      for value := range s {
        out = append(out, f(value))
      }
      return out
    }
    names := Map(users, func(user User) string {
      return user.Name
    })

  After:
    type Set[T comparable] map[T]struct{}
    func (s Set[T]) Map[U any](f func(T) U) []U {
      out := make([]U, 0, len(s))
      for value := range s {
        out = append(out, f(value))
      }
      return out
    }
    names := users.Map(func(user User) string {
      return user.Name
    })

你的智能体可以在一条命令中请求多个解释:

go-modern-guidelines explain generic_methods atomic_types errors_as_type

这些指南涵盖哪些内容

该项目涵盖 Go 1.0 至 Go 1.27 中实用的语言特性和标准库新增功能。它还包括 Go modernize 分析器所处理的模式。

这些指南帮助智能体选择如下模式:

  • 使用 slices.Contains 而不是手动搜索循环。
  • 使用 minmax 而不是手写比较。
  • 使用 cmp.Or 而不是选择第一个非零值的链式表达式。
  • 使用 sync.WaitGroup.Go 而不是分别调用 AddgoDone
  • 在 Go 1.26 及更高版本中使用 errors.AsType 进行类型安全的错误匹配。
  • 在 Go 1.26 及更高版本中,当你需要值的指针时使用 new(value)
  • 在 Go 1.27 中使用 strings.CutLastbytes.CutLast 替代 LastIndex 和手动切片。

这些示例解决了生成代码中的一个常见问题。智能体可能了解较旧的模式,因为该模式大量存在于现有代码中。提供明确的规则有助于智能体选择给定语法的最新形式。

这些现代 Go 技能是对 go fix 等工具的补充。我们的仓库帮助智能体从一开始就编写最新代码,而 go fix 命令则帮助更新代码库中已有的模式。

将指南安装到你的 AI 智能体中

你可以从插件市场或本地仓库安装该插件。两种方式都要求 Go 工具链位于你的 PATH 中。首次使用时,集成会通过 go install 安装命令行工具,并将其存储在本地缓存中。它不会修改你的项目。

从插件市场安装插件

  1. 打开与 AI 智能体的会话(例如,在终端中运行 claude)。
  2. 将 Modern Go Guidelines 添加为 Claude 插件市场:
/plugin marketplace add JetBrains/go-modern-guidelines
  1. 安装插件:
/plugin install modern-go-guidelines
  1. 激活指南:
/use-modern-go

集成会检查你项目中的 Go 版本,并向 AI 智能体提供相应的指南。

从本地仓库安装插件

在发布或更新插件之前,可以使用本地仓库进行测试。仓库根目录必须包含 .*-plugin/marketplace.json 文件。

  1. 打开终端并运行你的 AI 编程智能体。
  2. 将本地仓库添加为 Claude 插件市场。将示例路径替换为你仓库的绝对路径:
<claude|codex> plugin marketplace add /absolute/path/to/go-modern-guidelines
  1. 从插件市场安装插件:
<claude|codex> plugin install modern-go-guidelines@goland-<claude|codex>-marketplace
  1. 在你的 Go 项目中启动或重新启动 AI 智能体。
  2. 在会话中激活指南:
/use-modern-go

AI 智能体会从你的本地仓库读取插件市场定义,并将插件安装到其插件缓存中。你的仓库仍然是插件市场来源。

从现代 Go 开始

语言版本的发布速度快于模型训练周期。你的编码智能体需要一个精简且最新的权威来源来跟上节奏。

我们的现代 Go 技能仓库就提供了这样的来源,并且不会向智能体发送无关材料。你的 go.mod 文件划定了边界。list 子命令显示哪些内容适用。explain 子命令只在智能体需要时补充细节。

请在 Modern Go Guidelines 仓库 中探索项目、安装说明和当前指南。

祝编码愉快!

GoLand 团队