なんでも受ける型としての interface{}
型を使った場合にはそれは解決してメソッド呼び出しができない。
なぜならメソッド定義が無いから。しかし interface は元の(構造体等の)型情報を保持しているのでそれを元に復元できる。
この復元操作を型アサーションと言う。キャストでは無い。
interface{}
ではなく、なんらかの interface 型の何かの場合は、型アサーションする必要が無い。そのまま使えば自動的に解決してくれる。
このように書く
hoge, ok := piyo.(Fuga)
interface{}
型の piyo にメソッドを呼び出すかのようにドットを打って括弧の中に復元したい型を書く(この例は Fuga)。
そうすると2つの戻りがあって1つが復元された値(今回 hoge で受けている)、もう一つが復元の成否の boolean
が戻ってくる。
※
こののようにする。一見すると単なる分岐の switch
に見えるが全然違う特殊構文だと思った方がよい。
switch hoge := piyo.(type){ case Fuga: fmt.Println(hoge.aaa()) case Moge: fmt.Println(hoge.bbb()) }
type
といきなり謎のキーワードが入っているが、ここに case
に書いてある条件の型が入って元のモノに復元されて case
に記述されている処理に分岐する
interface{}
は格納した元のメタ情報を保持しているので復元可否で分岐することができる。