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
ツールが素朴に「Ord に C メソッドがありません」と診断すると嘘になる。正しくは「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