型アサーションはswitchを使用して、複数のどの型に一致するかを判定できます。
型アサーションは以下を参考にして下さい。
参考
switch型アサーション
nilかどうかの判定もできるようです。
package main
import (
"fmt"
)
// インターフェースの定義
type myInterface interface {
getName() string
}
// 犬の構造体の定義
type dog struct {
name string
}
// 犬のメソット定義
func (d dog) getName() string {
return d.name
}
// 猫の構造体の定義
type cat struct {
name string
}
// 猫のメソット定義
func (c cat) getName() string {
return c.name
}
func (c cat) cry() string {
return "にゃー"
}
func main() {
d := dog{}
d.name = "dog_name"
determineType(d) // dog_name が表示される
c := cat{}
c.name = "cat_name"
determineType(c) // にゃー が表示される
var m myInterface
determineType(m) // nil が表示される
}
func determineType(m myInterface) {
// switch型アサーション。
switch v := m.(type) {
case nil:
fmt.Printf("nil\n")
case dog:
fmt.Printf(v.getName() + "\n")
case cat:
fmt.Printf(v.cry() + "\n")
default:
fmt.Printf("デフォルト\n")
}
}