GoのinterfaceとGenericsの内部構造と進化

Room 1 16:30 - 16:50

Go 1.18でGenericsが導入され、型の抽象化がより安全かつ柔軟に書けるようになりました。このセッションでは、runtimeパッケージ(特に iface.go や runtime2.go に登場する eface 構造体)と、Generics関連のパッケージ(cmd/compile/internal/ssa や types2 など)を読み解きながら、Goにおけるany(interface{})型、通常のinterface、Genericsの内部構造の違いや実装方針について解説します。 このセッションのきっかけは、実務において汎用的な関数の引数にany型を取る実装がたびたび見られたことでした。any型は複数の型を扱える便利な仕組みですが、その内部は型と値の情報を持つデータ構造であり、ランタイムでの実行速度や挙動に影響を及ぼす場面もあります。たとえば、any型を引数に取るユーティリティ関数では、引数を直接nilと比較することができず、やや直感的ではない挙動になります。 実務ではGenericsを使うことでこれらの課題を回避できますが、Generics自体も進化を続けており、Go 1.20以降では型推論や制約処理、エスケープ解析、モノモーフィック化の最適化など多くの改善が行われています。Go 1.25ではコア型の仕組みが削除されるなど、設計上の選択も大きな変化を迎えています。 本セッションでは、実装の背景や議論にも触れながら、業務での意思決定にも役立つような「Goの型の内部構造の理解」を深めることを目指します。