一,如何检测和转换接口变量的类型

在Go语言的interface中可以是任何类型,所以Go给出了类型断言来判断某一时刻接口中所含有的类型,例如现在给出一个接口,名为InterfaceText:

x,err:=interfaceText.(T)//T是某一种类型

上式是接口断言的一般形式,因为此方法不一定每次都可以完好运行,所以err的作用就是判断是否出错。所以一般接口断言常用以下写法:

ifv,err:=InterfaceText.(T);err {//T是一种类型    possess(v)//处理v    return}

如果转换合法,则v为InterfaceText转换为类型T的值,err为ture,反之err为false。

值得注意的是:InterfaceText必须是接口类型!!!

有些时候若是想仅判断是否含有类型T,可以写为:

if_,err:=InterfaceText.(T);err{    //..    return}

下面给出一个具体的例子帮助理解:

packagemain import(    "fmt"    "math") typeSquare struct{    slide float32}typeCircle struct{    radius float32}typeFigure interface{    Area() float32}funcmain(){    varfi Figure    sq:=new(Square)    sq.slide=5    fi=sq    ifv,err:=fi.(*Square);err {        fmt.Printf("fi contain a variable of type : %v\n",v)    }else{        fmt.Println("fi does not contain a variable of Square")    }    ifv2,ok:=fi.(*Circle);ok {        fmt.Printf("fi contain a variable of type : %v\n",v2)    }else{        fmt.Println("fi does not contain a variable of Circle")    }}func(s *Square) Area() float32{    returns.slide*s.slide}func(c *Circle) Area() float32{    returnc.radius*c.radius*math.Pi}

运行结果:

二,类型判断:type-switch

这是另一种类型判断的方法,此方法和switch很相似。直接看代码:

switchx:=InterfaceText.(type) {    case*Square:        fmt.Printf("text:%v",i)    case*Circle:        //..    casenil:        //..    default:        //..    //..and so forth}

理解思路和switch很相似,如果InterfaceText中有*Square,*Circle,nil三种类型,就会执行对应的代码,若都没有,便会执行default里的代码。

如果仅判断,而不使用值的话可以写为:

switchInterfaceText.(type) {    case*Square:        fmt.Printf("text:%v",i)    case*Circle:        //..    casenil:        //..    default:        //..    //..and so forth}

有时为了方便,我们可以把它打包成一个函数来判断一些未知类型:

funcclassify(items...interface{}){    fori,x:=rangeitems {        switchx.(type) {        casebool:            fmt.Printf("text:%v",i)        caseint:            //..        casefloat32:            //..        default:            //..        //..and so forth        }    }}

可以这样调用此方法:classifier(13, -14.3, false) 。

当然也可以加入其他类型,这个看具体情况而定。

到此这篇关于Golang 类型断言的具体使用的文章就介绍到这了