データ型の判定は 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