タラバガニー設計局stalins.clubNOTE/notes/types-methodset

types.MethodSet (メソッドセット)

ある型に対して呼べるメソッドの集合。go/types では types.NewMethodSet で、SSA を組んだ後なら prog.MethodSets.MethodSet(T) で得られる。interface 充足の判定と、SSA でメソッド本体を辿るときの入口として使われる、静的解析の基礎的な仕組みである。

Go 1.27 の最重要変更は、generic method が MethodSet に「入る」ようになったこと

Ord                        Len=2 : A C(generic)
Gen[P] (未インスタンス化)   Len=2 : B D(generic)
Gen[int]                   Len=2 : B D(generic)

(象限 A〜D の定義は メソッドの4象限。)

ところがinterface は満たさない。しかも types.MissingMethod は「C が無い」ではなく**「C はあるが型が合わない」(wrongType=true)** と報告する。

Ord implements IfaceA{ A() }      => true
Ord implements IfaceC{ C(int) }   => false  missing=C wrongType=true

ツールが素朴に「OrdC メソッドがありません」と診断すると嘘になる。正しくは「C はあるが generic method なので interface を満たせない」。詳細は ジェネリクスメソッドはインターフェースを満たさない

Go チーム自身がこの領域で理解を反転させている。adonovan は当初「generic method は method set に現れない」と理解して x/tools を直していたが、2026-06-09 に逆と判明して CL を追加で流した(「I spoke too soon」)。dominikh の返し:

It feels like you (plural) have gone back and forth on that half a dozen times in the last 7 days. I hope someone can find the time to write something equivalent to golang/exp/typeparams/example for the impact of generic methods on the type system.

adonovan は同意して griesemer / mrkfrmn に私信を送ったと回答しているが、2026-08-15 時点でその公式解説文書は公開されていない。あわせて go/types 側で「generic method を method set から外す」CL 781264 が 2026-06-01 に land したものの同日 Broken builders で revert (CL 785740) され、以後 reland されていない。src/go/types/methodset.go は今も generic method 用の記述を持たないままである。

MethodSet に入るのに SSA 側でメソッド本体が取れない、という食い違いの実務上の影響は 静的解析から見たジェネリクスメソッド を参照。

出典

Go Release Party 1.27 の発表資料リポジトリ static-analysis.md §2.2・§2.3、issues.md §8、memo.md §1

▸ ノート一覧に戻る