データ型の判定は switch 文でもできる。これを型switchという。一般的な書式はこう。
switch v := x.(type) {
case 型1: 処理
case 型2: 処理
...
default: 処理
}
一昨日書いた型アサーションと似ているけど、カッコの中には type と書く。すると対応する型の case 節が実行される。
package main
import "fmt"
type Num interface {
number()
}
type Int int
func (n Int) number() {}
type Real float64
func (n Real) number() {}
func sumOfNum(ary []Num) (Int, Real) {
var sumi Int = 0
var sumr Real = 0.0
for _, x := range ary {
switch v := x.(type) {
case Int: sumi += v
case Real: sumr += v
}
}
return sumi, sumr
}
func main() {
var ary[]Num = []Num{
Int(1),
Real(1.1),
Int(2),
Real(2.2),
Int(3),
Real(3.3),
}
a, b := sumOfNum(ary)
fmt.Println(a, b)
}
^o^ > go run type_switch.go 6 6.6