时间:2023-03-09来源:系统城装机大师作者:佚名
在Go语言的interface中可以是任何类型,所以Go给出了类型断言来判断某一时刻接口中所含有的类型,例如现在给出一个接口,名为InterfaceText:
1 | x,err:=interfaceText.(T) //T是某一种类型 |
上式是接口断言的一般形式,因为此方法不一定每次都可以完好运行,所以err的作用就是判断是否出错。所以一般接口断言常用以下写法:
1 2 3 4 |
if v,err:=InterfaceText.(T);err { //T是一种类型 possess(v) //处理v return } |
如果转换合法,则v为InterfaceText转换为类型T的值,err为ture,反之err为false。
值得注意的是:InterfaceText必须是接口类型!!!
有些时候若是想仅判断是否含有类型T,可以写为:
1 2 3 4 |
if _,err:=InterfaceText.(T);err{ //.. return } |
下面给出一个具体的例子帮助理解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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\n" ,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\n" ,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 } |
运行结果:
这是另一种类型判断的方法,此方法和switch很相似。直接看代码:
1 2 3 4 5 6 7 8 9 10 11 |
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里的代码。
如果仅判断,而不使用值的话可以写为:
1 2 3 4 5 6 7 8 9 10 11 |
switch InterfaceText.( type ) { case *Square: fmt.Printf( "text:%v" ,i) case *Circle: //.. case nil : //.. default : //.. //..and so forth } |
有时为了方便,我们可以把它打包成一个函数来判断一些未知类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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) 。
当然也可以加入其他类型,这个看具体情况而定。
到此这篇关于Golang 类型断言的具体使用的文章就介绍到这了
2024-07-16
如何使用 Go 依赖库管理器修复损坏的依赖项?2024-07-07
Java框架如何简化代码的调试过程2023-03-17
Python 使用tf-idf算法计算文档关键字权重并生成词云的方法有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1 2 3 4 5 6 7 8 9 10 11 12 13 14...
2023-03-15
由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。 Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...
2023-03-09