Dev Study
Go コース

38. インターフェース値 — 動的型と動的値

インターフェース型の変数は、内部に「動的型(実際に入っている具体的な型)」と「動的値(その値そのもの)」のペアを保持しています。var s Shape = Circle{R: 2} と書くと、s の動的型は Circle、動的値はその Circle の値、という二つの情報を持ちます。%T と %v で表示すると、この型と値の両方を確認できます。

何も代入していないインターフェース値のゼロ値は nil で、動的型も動的値もありません。ここで注意したいのが、よくある落とし穴です。中身が nil のポインタ(例: var p *T = nil)をインターフェースに入れると、動的型 *T と nil 値が入った状態になり、インターフェース自体は nil ではなくなります。そのため i == nil が false になり、混乱を招くことがあります。

インターフェース値に対してメソッドを呼ぶと、保持している動的型のメソッドが呼ばれます。これが Go の動的ディスパッチで、同じインターフェース変数でも中身の型によって違う実装が走ります。インターフェースは「型と値のペアを運ぶ箱」だとイメージすると、この後の型アサーションや型 switch がすっきり理解できます。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Go
公式ドキュメントで詳しく ↗