[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 を満たしません。変数 okfalse になるため panic が実行されます。
Go