インターフェースの型を動的に判定したいとき「型アサーション」と「型Switch」を活用できます。ここでは簡単な例で動作確認してみます。
目次
型アサーション( t, ok := i.(T) )
t, ok := i.(T)
の形式で利用できます。
アサーションに成功した場合 ok=true
となり t
に値が代入されます。
以下、実行例です。
package main
import (
"fmt"
)
type SampleInterface interface {
Print()
}
type SampleA struct {
Name string
}
func (s SampleA) Print() {
fmt.Println("SampleA")
}
func (s SampleA) PrintOriginal() {
fmt.Println("SampleA Original")
}
type SampleB struct {
Message string
}
func (s SampleB) Print() {
fmt.Println("SampleB")
}
func test(i SampleInterface) {
sa, ok := i.(SampleA)
fmt.Printf("[sa: %v]\t[ok: %v]\n", sa, ok)
sb, ok := i.(SampleB)
fmt.Printf("[sb: %v]\t[ok: %v]\n", sb, ok)
if sa, ok := i.(SampleA); ok {
sa.PrintOriginal()
}
}
func main() {
fmt.Println("------------------------")
sa := SampleA{Name: "xxx"}
test(sa)
fmt.Println("------------------------")
sb := SampleB{Message: "yyy"}
test(sb)
}
------------------------
[sa: {xxx}] [ok: true]
[sb: {}] [ok: false]
SampleA Original
------------------------
[sa: {}] [ok: false]
[sb: {yyy}] [ok: true]
型Switch( switch v := i.(type) )
switch v := i.(type)
の形式で利用できます。
以下、実行例です。
package main
import (
"fmt"
)
type SampleInterface interface {
Print()
}
type SampleA struct {
Name string
}
func (s SampleA) Print() {
fmt.Println("SampleA")
}
type SampleB struct {
Message string
}
func (s SampleB) Print() {
fmt.Println("SampleB")
}
func test(i SampleInterface) {
switch v := i.(type) {
case SampleA:
fmt.Printf("SampleA[%T] value[%v]\n", v, v.Name)
case SampleB:
fmt.Printf("SampleB[%T] value[%v]\n", v, v.Message)
default:
fmt.Print("default")
}
}
func main() {
fmt.Println("------------------------")
sa := SampleA{Name: "xxx"}
test(sa)
fmt.Println("------------------------")
sb := SampleB{Message: "yyy"}
test(sb)
}
------------------------
SampleA[main.SampleA] value[xxx]
------------------------
SampleB[main.SampleB] value[yyy]