module mainstructUser { name string age int}fn (m &User) str() string {return'name:${m.name},age:${m.age}'}// 联合类型声明typeMySum= User |int|stringfn (ms MySum) str() string {if ms is int { // 使用is关键字,判断联合类型具体是哪种类型println('ms type is int') }match ms {// 对接收到的联合类型,使用match语句进行类型判断,每个match分支的ms变量都会被自动造型为分支中对应的类型int { return ms.str() }string { return ms } User { return ms.str() } }}fnadd(ms MySum) { // 联合类型作为参数match ms {// 可以对接收到的联合类型,使用match语句进行类型判断,每个match分支的ms变量都会被自动造型为分支中对应的类型int { println('ms is int,value is ${ms}') }string { println('ms is string,value is ${ms}') } User { println('ms is User,value is ${ms.str()}') } }}fnsub(i int, s string, u User) MySum { // 联合类型作为返回值return i// return s //这个也可以// return User{name:'tom',age:3} //这个也可以}fnmain() { i :=123 s :='abc' u := User{ name: 'tom' age: 33 }add(i)add(s)add(u)}
获取联合类型的具体类型
联合类型使用内置方法type_name()来返回变量的具体类型。
module mainstructPoint { x int}typeMySumType= Point |f32|intfnmain() {// 联合类型使用type_name() sa :=MySumType(32) sb :=MySumType(f32(123.0)) sc :=MySumType(Point{ x: 43 })println(sa.type_name()) // intprintln(sb.type_name()) // f32println(sc.type_name()) // Point}
联合类型相等判断
typeStr=string|runestructFoo { v int}structBar { v int}typeFooBar= Foo | Barfnmain() { s1 :=`s` s2 :=`s` u1 :=Str(rune(s1)) u2 :=Str(rune(s2))println( s1 == s1 ) //联合类型判断相等或不等:同类型,同值println( s1 == s2 )println( u1 == u1 )println( u1 == u2 )//类型不同,值相同也不等 foo :=FooBar( Foo{v: 0} ) bar :=FooBar( Bar{v: 0} )println( foo.v == bar.v )println( foo != bar )}
for is类型循环判断
用于联合类型的类型循环判断(感觉没啥用,就是一个语法糖而已):
module mainstructMilk {mut: name string}structEggs {mut: name string}typeFood= Eggs | Milkfnmain() {mut f :=Food(Eggs{'test'})//不带mutfor f is Eggs {println(typeof(f).name)break }//等价于for {if f is Eggs {println(typeof(f).name)break } }//带mutformut f is Eggs { f.name ='eggs'println(f.name)break }//等价于for {ifmut f is Eggs { f.name ='eggs'println(f.name)break } }}
as类型转换
可以通过as将联合类型显式转换为具体的类型,如果转换类型不成功,则报错:V panic: as cast: cannot cast。
module maintypeMysumtype=bool|f64|int|stringfnmain() { x :=Mysumtype(3) x2 := x as int //联合类型显式转换类型println(x2)}