Go 1.27 ジェネリクスメソッド 調査ノート
Go Release Party 1.27 (2026-08) の発表資料「Go 1.27 のジェネリクスメソッド — なぜ入り、何ができて、何ができないか」を作るにあたって調べたことの索引。 本体の概念は ジェネリクスメソッド (Go 1.27)。
調査時点は 2026-08-15〜16 (go1.27rc3)。時間で変わるもの (linter の対応状況、 open な issue、FAQ の文面) は各ノートに日付を添えてある。
なぜ入ったのか
- Go FAQ が却下した4案 — FAQ は実装方法を4案検討して全部却下していた。 4番目が "unacceptable from a design point of view"
- #77273 "A change of view." — 1行目が "A change of view."。採用されたのはその4番目
- メソッドはレシーバを持つ関数 — 見方の変更の中身。どこまで正しく、どこから正しくないか
何ができないのか
- ジェネリクスメソッドはインターフェースを満たさない — 受け入れた妥協点。効く範囲はメソッド単位
- 関数だと通りメソッドだと通らないシグネチャ — 関数だと通りメソッドだと通らないシグネチャ
- monomorphization checker — その出どころ。1.18 からある制限
- ダミー型パラメータによる instantiation cycle 回避 — ダミー型パラメータによる回避策と、それが推奨されない理由
- メソッド式とメソッド値 — メソッド式・メソッド値はレシーバを先に instantiate する必要がある
- 既存メソッドへの型パラメータ後付けは破壊的変更 — 既存 API のメソッド化は非互換になる
実装
- GC shape stenciling と dictionary — 既存のジェネリクスと同じ方式。 dictionary はレシーバ由来とメソッド由来の型引数を連結する
- エクスポートデータ形式と UIR V4 — エクスポートデータ形式のバンプが要った
- 「バイナリサイズ +60KB」は別機能の話 — 混同しやすい別機能の話
静的解析から見ると
- メソッドの4象限 — 「ジェネリックなメソッド」は2つの軸を混ぜた語。 1.27 で増えたのは4象限のうち2つ
- types.MethodSet (メソッドセット) — MethodSet には入るのに interface は満たさない
- 静的解析から見たジェネリクスメソッド — 実測ベースの罠の一覧
- linter が Go 1.27 に追いついていない — 2026-08-15 時点で golangci-lint も staticcheck 安定版も Go 1.27 非対応
標準ライブラリと後続の提案
- 標準ライブラリ唯一のジェネリクスメソッド rand.N — 1.27 で入った唯一の標準ジェネリクスメソッド
- must: Do が却下された理由 — 言語機能が入っても標準ライブラリに入るとは限らない
- attractive nuisance — その判断に使われた語彙
- xiter は取り下げ済み — イテレータのアダプタは「未定」ではなく「当面入らない」
- generic associated type と Go の判断基準 — 次に来そうだった提案と、Go の判断基準
書けるようになったこと (実例)
- iter.Seq と range-over-func — 中間スライスを作らずに繋がる Stream を自分で書く
- tanukirpc の RouteWithTransformer — 16個中1個だけメソッドになれなかった API
発表資料そのものについて
- AI に API を使わせたのは godoc だけだった — メソッド化しても AI の選択は変わらなかった。 効いたのは godoc だけ (発表には含めていない)
- お題に答えを書くと測定にならない — お題に答えを書くと測定にならない
- peitho で資料を書く — 資料を組んだツールの制約