13分で読めます
  • AI
  • ツール

エージェントのGoが古い——Modern Go Guidelinesで、いまの書き方を渡す

今週のGitHub Trendingで話題のJetBrains公式スキル。エージェントが古いGoを書く二つの理由と、Claude Code・Codex・Cursorへの入れ方、注意点を整理します。

カテゴリー: AI · ツール | 公開: 2026年9月4日 | 読了目安: 約13分

今週のGitHub Trendingで話題のJetBrains公式スキル。エージェントが古いGoを書く二つの理由と、Claude Code・Codex・Cursorへの入れ方、注意点を整理します。

📑 目次

ふむふむ。コーディングエージェントにGoを書かせると、動くのに、なんだか少し昔の書き方をしてくる——ありませんか?

for i := 0; i < n; i++ は出てくる。slices.Contains は出てこない。エラー比較は == のまま。go.mod は新しいのに、生成コードだけが過去の平均値に引っ張られる。便利なのに、レビューで「ここ、いまはこう書くよ」が増えていくんですよね。

今週のGitHub Trendingで目に留まった Modern Go GuidelinesJetBrains/go-modern-guidelines)は、そこを正面から扱おうとしているエージェント向けスキルです。GoLandチームが出している公式プロジェクトで、ライセンスは Apache License 2.0。エージェントに「いまのGo」の参照を渡し、go.mod のバージョンまでに使える書き方を選ばせようとします。

でも、本当に必要なのは新しいプロンプトでしょうか。それとも、学習データの多数決を、いまの言語仕様で上書きする小さな辞書でしょうか。今日は公式READMEとGoLandブログを手がかりに、入れ方まで歩いてみます。

本記事は公開情報をもとにした個人的な技術メモです。第三者ツール・AIサービス・モデルの仕様、コマンド、対応エージェント、言語機能の範囲は変わる可能性があります。導入前に公式リポジトリ、ライセンス、利用条件を確認してください。

何をするスキルなのか

Modern Go Guidelines は、コーディングエージェントが現代的なGoを書くためのガイドラインです。人間向けのスタイルガイドというより、エージェントが編集の直前に参照する、バージョンつきの辞書に近いものです。

公式READMEの例では、ガイドラインを入れたエージェントは次のような置き換えを選びます。

  • 手書きの大小比較ではなく max(a, b)
  • 手動ループではなく slices.Contains
  • nil や空文字の連鎖ではなく cmp.Or(a, b, c)
  • Go 1.26 以降なら、値へのポインタに new(42)、型つきのエラー判定に errors.AsType[T](err)

対象は Go 1.0 から Go 1.27 までの、よく使う言語機能と標準ライブラリです。Goチームの modernize アナライザが狙うパターンも含みます。エージェント側の動きは、公式READMEでは次の三つに整理されています。

  1. プロジェクトのGoバージョンを go.mod から見る
  2. そのバージョンまでに使える機能と標準ライブラリだけを使う
  3. 古い書き方より、いまの慣用を優先する

ここ、面白いところです。大きなモデルに「最新のGoを書いて」と頼むだけでは足りない、という設計なんですね。モデルは平均的な過去をよく知っている。だから、いま使える範囲を外から渡す。チカちゃん的には、記憶の話というより、参照の話です。

なぜ、エージェントのGoは古くなるのか

公式READMEは、理由を二つに分けています。

ひとつは 学習データの遅れ。カットオフよりあとに入った機能は、見たことがない。Go 1.26 の errors.AsType[T] を、学習していないモデルは使えません。

もうひとつは 頻度の偏り。知っていても、古い型のほうが訓練データに多い。for i := range n より for i := 0; i < n; i++ のほうが、世の中のコードにはたくさんある。だから、そちらが出てくる。

ちょっと待って。これ、人間にもありませんか? 昔うまくいった書き方を、新しい道具があるのに繰り返す。多数派の過去は、正しい現在より声が大きい。エージェントの「古さ」は、機械の欠陥というより、よく見かけるものが勝つという、かなり人間くさい癖にも見えます。

GoLandチームのブログ(2026年8月24日)も、同じ遅れを前提にしています。言語のリリースは、モデルの再学習より速い。だからエージェントには、小さくて新しい「いまの正解」が要る、と。

反対側の見方も置いておきます。古い書き方が悪いとは限りません。チームのコードがまだ for i := 0; i < n; i++ なら、そこだけ突然 range n にすると、差分が読みにくくなることもあります。「現代的」は、コンパイルできることと、レビューできることのあいだで選ぶ値です。このスキルは前者を強く押します。後者は、人間側の仕事として残ります。

事前に用意するもの

マーケットプレイス連携は、初回に小さなCLIを go install で入れます。だから Goのツールチェーンが PATH にあること が前提です。公式は go.dev/dl を案内しています。

確認はこれだけで足ります。

go version

CLI本体は、たとえば ~/.cache/go-modern-guidelines のようなローカルキャッシュへ入ります。プロジェクトのファイルは書き換えません。 対象は Go 1.25 以上。それより古いGoでも、既定の GOTOOLCHAIN=auto が有効なら、初回に互換ツールチェーンを取って動く、とREADMEは書いています。

対応エージェントは、執筆時点のREADMEでは次のとおりです。

  • Junie
  • Claude Code
  • Codex
  • Cursor
  • その他(skills.sh 経由。OpenCode など)

コマンド名はエージェントごとに違います。古いブログ記事と現行READMEでも、スラッシュコマンドの書き方が少し違います。迷ったら リポジトリのREADMEを優先 してください。

Claude Code に入れる

Goのリポジトリを開いた状態で、Claude Code のセッション内から入れます。

/plugin marketplace add JetBrains/go-modern-guidelines
/plugin install modern-go-guidelines@goland-claude-marketplace

Claude Code は、Goの作業に関係するとスキルを自動で呼びます。明示したいときは、次です。

/modern-go-guidelines:use-modern-go

第三者マーケットプレイスの自動更新は、標準ではオフです。毎回新しいガイドラインを取りたいなら、一度だけ有効化します。

  1. /plugin を開く
  2. Marketplaces から goland-claude-marketplace を選ぶ
  3. Enable auto-update を選ぶ

更新が入ったあとは、いまのセッションへ反映するために /reload-plugins が案内されています。端末から手動で更新する場合は、公式READMEの次です。

claude plugin marketplace update goland-claude-marketplace
claude plugin update modern-go-guidelines@goland-claude-marketplace

Codex に入れる

こちらはセッション内ではなく、端末から入れます。

codex plugin marketplace add JetBrains/go-modern-guidelines
codex plugin add modern-go-guidelines@goland-codex-marketplace

更新は、キャッシュを入れ替える手順です。

codex plugin marketplace upgrade goland-codex-marketplace
codex plugin remove modern-go-guidelines@goland-codex-marketplace
codex plugin add modern-go-guidelines@goland-codex-marketplace

upgrade のあとに一度外して入れ直す。READMEがそう書いているので、ここは省略しないのが安全です。

Cursor と、それ以外

Cursor は、まず端末でマーケットプレイスを足します。

cursor-agent plugin marketplace add https://github.com/JetBrains/go-modern-guidelines

そのあと Cursor のセッション内で /plugins からプラグインを入れます。更新は次です。

cursor-agent plugin marketplace update goland-cursor-marketplace

公式READMEの注意として、Cursor には インストール済みプラグインを非対話で更新するCLIが、いまのところない とあります。マーケットプレイスを更新しても古い版のままなら、セッション内の /plugins から入れ直します。

Claude Code / Codex / Cursor 以外なら、skills.sh 経由です。

npx skills add JetBrains/go-modern-guidelines

このスキルだけに絞るなら --skill use-modern-go を足します。プロジェクトへ入れたスキルの更新は次です。

npx skills update use-modern-go -p -y

グローバルなら -p-g にします。

Junie CLI を使っている人は、セッション内で /extensions marketplace add JetBrains/go-modern-guidelines のあと /extensions install modern-go-guidelines です。Goの作業なら自動で呼ばれる、とREADMEは書いています。

中で何が起きているか——listexplain

プラグインを入れると、エージェント向けのスキル use-modern-go が付きます。中身は「ガイドライン全文を毎回貼る」ではありません。短い一覧を先に取り、必要な項目だけ詳しく見る 設計です。GoLandブログは、必要なときだけ詳細を出す段階的な開示だと説明しています。

エージェントは、Goファイルを触る前に list を呼びます。ファイルパスを渡すと、そのファイルに効くGoバージョンへ絞られます。

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.

詳しく知りたいIDだけ explain します。

go-modern-guidelines explain generic_methods
go-modern-guidelines explain generic_methods atomic_types errors_as_type

スキル本体(plugin/skills/use-modern-go/SKILL.md)は、エージェントにこう命じています。

  • Goを書く・直す前に、まず list を呼べ
  • 出力を headgrep で切るな。古い項目もまだ効く
  • 返ってきたガイドラインを、いまのスタイルの根拠として扱え
  • 近くの既存コードが古くても、コンパイルできない・意味が変わる・対象外、以外では従う
  • explain は、IDが分かってから呼べ。空打ちするな

実際の呼び出しは、エージェントごとにラッパー(scripts/run-tool.sh など)を通します。人間が PATH へ go-modern-guidelines を常駐させる前提ではありません。ブログのコマンド例は、ラッパーの向こうにあるCLIの形です。

バージョンの境界もはっきりしています。ブログの例では、go 1.25 のプロジェクトなら Go 1.25 までが渡され、Go 1.26 の errors.AsType は出ません。Go 1.25 で入った sync.WaitGroup.Go は出ます。新しい機能を教えることと、コンパイルできない未来を教えないこと がセットなんです。

どんな置き換えを教えるのか

公式が繰り返し挙げている例を、人間向けに少しだけ訳します。詳細と前後コードは FEATURES.md にあります。ただし FEATURES.md 自身が 作業中 と書いてあるので、食い違いはREADMEとブログを優先してください。

古い側のイメージいまの側だいたいの時期
要素があるか手で探すslices.ContainsGo 1.21+
if a < b で小さいほうmin / maxGo 1.21+
for i := 0; i < n; i++for i := range nGo 1.22+
空文字の if 連鎖cmp.OrGo 1.22+
WaitGroup.Add + go + DoneWaitGroup.GoGo 1.25+
値のポインタを回避で作るnew(value)Go 1.26+
errors.As のポインタ渡しerrors.AsType[T]Go 1.26+
LastIndex して切るstrings.CutLast / bytes.CutLastGo 1.27+

ブログは、既存コードの更新は go fix、新規の生成はこちらのスキル、と役割を分けています。すでにリポジトリにある古さを直す道具と、これから書く古さを減らす道具。両方あるほうが、エージェント時代のGoにはしっくりきます。

注意点——入れただけで、現代にはならない

すごい、で終わらせると危ないので、ここでブレーキです。

エージェントは、スキルを無視できます。 ガイドラインは参照です。強制コンパイラではありません。入れたあとも、生成された差分を人間が見る前提が残ります。

既存のコードベースは勝手に書き換わりません。 キャッシュへCLIが入るだけで、リポジトリは触られません。過去のファイルをまとめて新しくしたいなら、Go本体の go fixmodernize の話です。このスキルは「これから書く側」です。

チームの慣用とぶつかることがあります。 スキルは「近くが古くても、新しいほうへ寄せよ」と書いています。レガシーを維持したいモジュールでは、セッションで対象バージョンを下げたり、このスキルを使わない選択もあり得ます。

初回はネットワークと go install が走ります。 オフラインや、ツールチェーンを制限した環境では、そこで止まります。プロジェクトは汚しませんが、ホーム配下のキャッシュとGoのモジュールキャッシュは増えます。

ドキュメントの世代差があります。 2026年2月のJetBrainsブログは /use-modern-go と短いインストール名、8月のブログも /use-modern-go、現行READMEは /modern-go-guidelines:use-modern-go とマーケットプレイス付きのインストール名です。記事の手順が動かないときは、まずREADMEを見てください。

「新しい」は常に「読みやすい」ではありません。 omitzeroomitempty のように、ゼロ値の意味が変わると、JSONの形まで変わります。ブログ自身、文字列・スライス・マップは omitempty を残せ、と注意しています。ガイドラインを盲信すると、コンパイルは通って、ワイヤ形式が変わる——そういう罠もあります。

どんな人に向いている?

  • Goをエージェントに書かせて、レビューで昔の書き方が目立つ人
  • go.mod のバージョンと、生成コードの世代を揃えたい人
  • Claude Code / Codex / Cursor を、すでにGoの日常に使っている人
  • go fix で過去を直し、スキルで未来の生成を抑えたい人

逆に、Goを書かない、エージェントにコードを触らせない、チームが意図して古い方言を守っている、という人には急がなくてよい道具です。言語の「いま」を外から渡すツールなので、渡す相手がいないと動きません。

まとめ——多数派の過去に、いまの辞書を渡す

Modern Go Guidelines は、エージェントを賢く見せるための新しいモデルではありません。学習データの多数決に、go.mod という境界つきの辞書を添える道具です。

Claude Code なら、入口は短くてこうです。

/plugin marketplace add JetBrains/go-modern-guidelines
/plugin install modern-go-guidelines@goland-claude-marketplace

入れたあとは、Goの作業でスキルが呼ばれ、必要なら listexplain が裏側で走ります。まずは読み取りに近い小さな修正で、生成コードのループやエラー判定がどう変わるかを見てみてください。

モデルは、よく見たものを出します。言語は、よく見るものより先へ進みます。そのズレを責めるより、ズレを参照で埋める。チカちゃん的には、そこが一番おいしいところです。人間の習慣も、同じ穴を持っています。新しい道具を知っていても、手が古い型を選ぶ。

あなたがエージェントに渡したいのは、もっと大きなモデルですか。それとも、いまの言語に追いつく、小さな辞書でしょうか。


参考URL


本記事は公開情報をもとにした個人的な技術メモです。Modern Go Guidelines は JetBrains の公式オープンソースプロジェクトで、ライセンスは Apache License 2.0 です。対応エージェント、スラッシュコマンド、CLIのサブコマンド、対象Goバージョンは更新されます。導入前に公式READMEを確認してください。初回実行は go install とネットワークを伴います。生成コードの正確さ、既存コードとの一貫性、JSONタグなど意味の変わる置き換えは、人間のレビューが必要です。FEATURES.md は作業中の文書です。言語機能の詳細は Go のリリースノートもあわせて見てください。

思索は冒険です。今日の話も、その入口のひとつでした。

  • インターネット上のツールは第三者が提供するものです。開発工程や配布経路を悪用した攻撃(サプライチェーン攻撃)が仕掛けられる可能性もゼロではありません。ご利用の際は公式リポジトリの情報をご確認いただき、自己責任でお使いください。
  • AIに関する技術や情報は急速に変化します。本記事の内容が公開後に古くなる可能性があります。各サービスの公式ドキュメントや最新情報をご確認ください。