[Go] interface{} 型のデータが特定の型として扱えるかチェックする
作成日: 2021年07月23日
変数名.(型名)
という構文を使用することで interface{}
型の変数に保持されているデータが、特定の型として扱えるか判定することができます。この構文は型アサーション(Type Assertion)と呼ばれています。下記の例では、2 つの interface{}
型の変数 someAnimal1
someAnimal2
がそれぞれ DogInterface
を満たしているかを判定しています。
package main
type DogInterface interface {
Bow()
}
type Dog struct{}
func (d *Dog) Bow() {
}
type Computer struct{}
func main() {
var someAnimal1 interface{}
someAnimal1 = new(Dog)
_, ok := someAnimal1.(DogInterface)
if !ok {
panic("someAnimal1 は DogInterface を満たしていません")
}
var someAnimal2 interface{}
someAnimal2 = new(Computer)
_, ok = someAnimal2.(DogInterface)
if !ok {
panic("someAnimal2 は DogInterface を満たしていません")
}
}
実行結果は下記のとおりです。
panic: someAnimal2 は DogInterface を満たしていません
goroutine 1 [running]:
main.main()
/home/default/workspace/golang/typeassertion/main.go:26 +0xa5
exit status 2
panic: someAnimal2 は DogInterface を満たしていません
goroutine 1 [running]:
main.main()
/home/default/workspace/golang/typeassertion/main.go:26 +0xa5
exit status 2
説明
- 変数
someAnimal1
にはDog
型のゼロ値へのポインターを格納しています。Dog
構造体はBow
関数を実装していますので、インターフェースDogInterface
を満たします。 - 変数
someAnimal2
にはComputer
型のゼロ値へのポインターを格納しています。Computer
構造体はBow
関数を実装していないので、インターフェースDogInterface
を満たしません。変数ok
はfalse
になるため panic が実行されます。