最近在实现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)
}

最后输出

56.67float64
10-15 20:44