[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 が実行されます。