[Go] interface{} 型のデータが特定の型として扱えるかチェックする

変数名.(型名) という構文を使用することで 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

説明

Go