空のインターフェイス
go言語は全ての型と互換性のある空インターフェイス型を宣言できる。
var kara interface{}
kara = 100
fmt.Println(kara)
fmt.println(&kara)
kara = "Empty"
fmt.Println(kara)
kara = [4]string{"K", "A", "R" "A"}
fmt.Println(kara)
実行結果
100
0xc000080ec0
Empty
[K A R A]
型アサーション
どんな型でも受け取れる空インターフェイスですが、逆に引数で受け渡された値は元の型の情報が欠落しています。
そのためGo言語では型アサーションを提供しており、型アサーションによりその受け取った型が何であるかを以下のように動的にチェックすることができます。
構文
t, ok := i.(T)
i が T(型名) を保持していれば、 t は基になる値になり、 ok は真(true)になります。
そうでなければok は偽(false)になります。
例
func assertion(obj interface{}) {
v1, ok := obj.(int)
if ok {
fmt.Println("int", v1)
}
v2, ok := obj.(string)
if ok {
fmt.Println("string", v2)
}
}
func main() {
assertion(100)
assertion("ASSERTION")
}
実行結果
int 100
string ASSERTION