一,软件开发定制如何检测和转换接口变量的类型
在的interface软件开发定制中可以是任何类型,所以Go软件开发定制给出了类型断言来判断某一时刻接口中所含有的类型,例如现在给出一个接口,名为InterfaceText:
x,err:=interfaceText.(T)//T是某一种类型
上式是接口断言的一般形式,因为此方法不一定每次都可以完好运行,所以err的作用就是判断是否出错。所以一般接口断言常用以下写法:
- if v,err:=InterfaceText.(T);err {//T是一种类型
- possess(v)//处理v
- return
- }
如果转换合法,则v为InterfaceText转换为类型T的值,err为ture,反之err为false。
值得注意的是:InterfaceText必须是接口类型!!!
有些时候若是想仅判断是否含有类型T,可以写为:
- if _,err:=InterfaceText.(T);err{
- //..
- return
- }
下面给出一个具体的例子帮助理解:
- package main
-
- import (
- "fmt"
- "math"
- )
-
- type Square struct{
- slide float32
- }
- type Circle struct{
- radius float32
- }
- type Figure interface{
- Area() float32
- }
- func main(){
- var fi Figure
- sq:=new(Square)
- sq.slide=5
- fi=sq
- if v,err:=fi.(*Square);err {
- fmt.Printf("fi contain a variable of type : %v\",v)
- }else {
- fmt.Println("fi does not contain a variable of Square")
- }
- if v2,ok:=fi.(*Circle);ok {
- fmt.Printf("fi contain a variable of type : %v\",v2)
- }else {
- fmt.Println("fi does not contain a variable of Circle")
- }
- }
- func (s *Square) Area() float32{
- return s.slide*s.slide
- }
- func (c *Circle) Area() float32{
- return c.radius*c.radius*math.Pi
- }
运行结果:
二,类型判断:type-switch
这是另一种类型判断的方法,此方法和switch很相似。直接看代码:
- switch x:=InterfaceText.(type) {
- case *Square:
- fmt.Printf("text:%v",i)
- case *Circle:
- //..
- case nil:
- //..
- default:
- //..
- //..and so forth
- }
理解思路和switch很相似,如果InterfaceText中有*Square,*Circle,nil三种类型,就会执行对应的代码,若都没有,便会执行default里的代码。
如果仅判断,而不使用值的话可以写为:
- switch InterfaceText.(type) {
- case *Square:
- fmt.Printf("text:%v",i)
- case *Circle:
- //..
- case nil:
- //..
- default:
- //..
- //..and so forth
- }
有时为了方便,我们可以把它打包成一个函数来判断一些未知类型:
- func classify(items...interface{}){
- for i,x:=range items {
- switch x.(type) {
- case bool:
- fmt.Printf("text:%v",i)
- case int:
- //..
- case float32:
- //..
- default:
- //..
- //..and so forth
- }
- }
- }
可以这样调用此方法:classifier(13, -14.3, false)
。
当然也可以加入其他类型,这个看具体情况而定。
ending~~