[golang] go的typeswitch guard语法

最近在实现golang,看到个go的特性语法: typeswitch guard。

typeswitch guard语法如下:

package main import "fmt" func typeChecking(p interface{}) { switch p.(type) { case int: fmt.Print("int") case float64: fmt.Printf("float64") } } func main(){ typeChecking(56.67) typeChecking(56) }

运行时判断p的类型,并根据是什么类型进行对应操作,较之与其他语言比如java的连续if else在语法上要美观一些:

if(p instance of TypeA){ System.out.println("Type A"); }else if (p instance of TypeB){ System.out.println("Type B"); }...

另外需要注意它的参数只能是interface,因为其他类型都可以被编译器编译时type inference,只有interface具有运行时类型。

既然实现golang,就多说一点
typeswitch 在golang 1.11对应的ast 结构如下:

TypeSwitchGuard struct { Lhs *Name // nil means no Lhs := X Expr // X.(type) expr }

也就是说typeswitch guard其实是有两种语法的:

X.(type) Lhs := X.(type)

我们可以将typeswitch guard的值赋给一个变量,变量的值相当于p本身的值:

func typeChecking(p interface{}) { switch q :=p.(type) { case int: fmt.Print("int") case float64: fmt.Print(q) fmt.Printf("float64") } } func main(){ typeChecking(56.67) }

最后输出

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppsx.html