エージェントのGoが古い——Modern Go Guidelinesで、いまの書き方を渡す
今週のGitHub Trendingで話題のJetBrains公式スキル。エージェントが古いGoを書く二つの理由と、Claude Code・Codex・Cursorへの入れ方、注意点を整理します。
今週のGitHub Trendingで話題のJetBrains公式スキル。エージェントが古いGoを書く二つの理由と、Claude Code・Codex・Cursorへの入れ方、注意点を整理します。
📑 目次
ふむふむ。コーディングエージェントにGoを書かせると、動くのに、なんだか少し昔の書き方をしてくる——ありませんか?
for i := 0; i < n; i++ は出てくる。slices.Contains は出てこない。エラー比較は == のまま。go.mod は新しいのに、生成コードだけが過去の平均値に引っ張られる。便利なのに、レビューで「ここ、いまはこう書くよ」が増えていくんですよね。
今週のGitHub Trendingで目に留まった Modern Go Guidelines(JetBrains/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では次の三つに整理されています。
- プロジェクトのGoバージョンを
go.modから見る - そのバージョンまでに使える機能と標準ライブラリだけを使う
- 古い書き方より、いまの慣用を優先する
ここ、面白いところです。大きなモデルに「最新の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
第三者マーケットプレイスの自動更新は、標準ではオフです。毎回新しいガイドラインを取りたいなら、一度だけ有効化します。
/pluginを開く- Marketplaces から
goland-claude-marketplaceを選ぶ - 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は書いています。
中で何が起きているか——list と explain
プラグインを入れると、エージェント向けのスキル 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を呼べ - 出力を
headやgrepで切るな。古い項目もまだ効く - 返ってきたガイドラインを、いまのスタイルの根拠として扱え
- 近くの既存コードが古くても、コンパイルできない・意味が変わる・対象外、以外では従う
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.Contains | Go 1.21+ |
if a < b で小さいほう | min / max | Go 1.21+ |
for i := 0; i < n; i++ | for i := range n | Go 1.22+ |
| 空文字の if 連鎖 | cmp.Or | Go 1.22+ |
WaitGroup.Add + go + Done | WaitGroup.Go | Go 1.25+ |
| 値のポインタを回避で作る | new(value) | Go 1.26+ |
errors.As のポインタ渡し | errors.AsType[T] | Go 1.26+ |
LastIndex して切る | strings.CutLast / bytes.CutLast | Go 1.27+ |
ブログは、既存コードの更新は go fix、新規の生成はこちらのスキル、と役割を分けています。すでにリポジトリにある古さを直す道具と、これから書く古さを減らす道具。両方あるほうが、エージェント時代のGoにはしっくりきます。
注意点——入れただけで、現代にはならない
すごい、で終わらせると危ないので、ここでブレーキです。
エージェントは、スキルを無視できます。 ガイドラインは参照です。強制コンパイラではありません。入れたあとも、生成された差分を人間が見る前提が残ります。
既存のコードベースは勝手に書き換わりません。 キャッシュへCLIが入るだけで、リポジトリは触られません。過去のファイルをまとめて新しくしたいなら、Go本体の go fix や modernize の話です。このスキルは「これから書く側」です。
チームの慣用とぶつかることがあります。 スキルは「近くが古くても、新しいほうへ寄せよ」と書いています。レガシーを維持したいモジュールでは、セッションで対象バージョンを下げたり、このスキルを使わない選択もあり得ます。
初回はネットワークと go install が走ります。 オフラインや、ツールチェーンを制限した環境では、そこで止まります。プロジェクトは汚しませんが、ホーム配下のキャッシュとGoのモジュールキャッシュは増えます。
ドキュメントの世代差があります。 2026年2月のJetBrainsブログは /use-modern-go と短いインストール名、8月のブログも /use-modern-go、現行READMEは /modern-go-guidelines:use-modern-go とマーケットプレイス付きのインストール名です。記事の手順が動かないときは、まずREADMEを見てください。
「新しい」は常に「読みやすい」ではありません。 omitzero と omitempty のように、ゼロ値の意味が変わると、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の作業でスキルが呼ばれ、必要なら list と explain が裏側で走ります。まずは読み取りに近い小さな修正で、生成コードのループやエラー判定がどう変わるかを見てみてください。
モデルは、よく見たものを出します。言語は、よく見るものより先へ進みます。そのズレを責めるより、ズレを参照で埋める。チカちゃん的には、そこが一番おいしいところです。人間の習慣も、同じ穴を持っています。新しい道具を知っていても、手が古い型を選ぶ。
あなたがエージェントに渡したいのは、もっと大きなモデルですか。それとも、いまの言語に追いつく、小さな辞書でしょうか。
参考URL
- GitHub Trending(週次) → https://github.com/trending?since=weekly
- JetBrains/go-modern-guidelines → https://github.com/JetBrains/go-modern-guidelines
- FEATURES.md → https://github.com/JetBrains/go-modern-guidelines/blob/main/FEATURES.md
- use-modern-go スキル → https://github.com/JetBrains/go-modern-guidelines/blob/main/plugin/skills/use-modern-go/SKILL.md
- GoLandブログ(2026-08-24) → https://blog.jetbrains.com/go/2026/08/24/help-ai-coding-agents-write-up-to-date-code-with-modern-golang-skills/
- Go のダウンロード → https://go.dev/dl/
- Apache License 2.0 → https://github.com/JetBrains/go-modern-guidelines/blob/main/LICENSE
本記事は公開情報をもとにした個人的な技術メモです。Modern Go Guidelines は JetBrains の公式オープンソースプロジェクトで、ライセンスは Apache License 2.0 です。対応エージェント、スラッシュコマンド、CLIのサブコマンド、対象Goバージョンは更新されます。導入前に公式READMEを確認してください。初回実行は
go installとネットワークを伴います。生成コードの正確さ、既存コードとの一貫性、JSONタグなど意味の変わる置き換えは、人間のレビューが必要です。FEATURES.md は作業中の文書です。言語機能の詳細は Go のリリースノートもあわせて見てください。
思索は冒険です。今日の話も、その入口のひとつでした。
- インターネット上のツールは第三者が提供するものです。開発工程や配布経路を悪用した攻撃(サプライチェーン攻撃)が仕掛けられる可能性もゼロではありません。ご利用の際は公式リポジトリの情報をご確認いただき、自己責任でお使いください。
- AIに関する技術や情報は急速に変化します。本記事の内容が公開後に古くなる可能性があります。各サービスの公式ドキュメントや最新情報をご確認ください。