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