最近在实现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 结构如下:
也就是说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) }最后输出