menu
書いてる野郎
orebike@gmail.com
※ interface{}
の意味や内部、その挙動、設計は現在の自分には難しく以下の内容は間違っている可能性も高い。このへんの話は入門書には載ってない。
var hoge interface{} = 123
何一つ実装されている必要が無い interface なのでつまりなんでもを指す。なので interface{}
型の変数にはなんでも入るということになる。
interface の変数はその interface を実装しているモノならなんでも入る。代入時に入るかどうかの(静的)チェックがあり、そのポインタが格納される。 実体でやればそのコピーのポインタ、ポインタで入れればそのポインタそのものが格納される。 メソッドを使うときには自動解決されるのでどの形式で入っているかはあまり考えなくてよくなっている。
interface{}
型の変数は代入時に特殊な格納処理をする。値とそのメタ情報を変数内に格納する。
そして使うのだが、使うことができない。なぜならメソッドが定義されてないからである。メソッドだけ見るならばどの型にもなりうるからである。
interface{}
型の変数は型アサーションという操作が可能になっていて、格納したメタ情報と値を元に元に型に復元することができる。
これはキャストではない。キャストというのは元の型を別の型へ外形を無理矢理変形させることである。つまり操作側がどの型に変形させるかは自由なのである。できるかどうかは別として。
型アサーションというのは、元々その型だったモノが機能を失った状態で凍結されているのでそれを元に戻す操作になる。jなのでどの型にでもできるわけでない。
受け取った時から何の型として操作するかは決まっているのである。