软件开发定制Golang 类型断言

一,软件开发定制如何检测和转换接口变量的类型

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

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

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

  1. if v,err:=InterfaceText.(T);err {//T是一种类型
  2. possess(v)//处理v
  3. return
  4. }

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

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

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

  1. if _,err:=InterfaceText.(T);err{
  2. //..
  3. return
  4. }

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

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type Square struct{
  7. slide float32
  8. }
  9. type Circle struct{
  10. radius float32
  11. }
  12. type Figure interface{
  13. Area() float32
  14. }
  15. func main(){
  16. var fi Figure
  17. sq:=new(Square)
  18. sq.slide=5
  19. fi=sq
  20. if v,err:=fi.(*Square);err {
  21. fmt.Printf("fi contain a variable of type : %v\",v)
  22. }else {
  23. fmt.Println("fi does not contain a variable of Square")
  24. }
  25. if v2,ok:=fi.(*Circle);ok {
  26. fmt.Printf("fi contain a variable of type : %v\",v2)
  27. }else {
  28. fmt.Println("fi does not contain a variable of Circle")
  29. }
  30. }
  31. func (s *Square) Area() float32{
  32. return s.slide*s.slide
  33. }
  34. func (c *Circle) Area() float32{
  35. return c.radius*c.radius*math.Pi
  36. }

运行结果:

 二,类型判断:type-switch

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

  1. switch x:=InterfaceText.(type) {
  2. case *Square:
  3. fmt.Printf("text:%v",i)
  4. case *Circle:
  5. //..
  6. case nil:
  7. //..
  8. default:
  9. //..
  10. //..and so forth
  11. }

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

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

  1. switch InterfaceText.(type) {
  2. case *Square:
  3. fmt.Printf("text:%v",i)
  4. case *Circle:
  5. //..
  6. case nil:
  7. //..
  8. default:
  9. //..
  10. //..and so forth
  11. }

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

  1. func classify(items...interface{}){
  2. for i,x:=range items {
  3. switch x.(type) {
  4. case bool:
  5. fmt.Printf("text:%v",i)
  6. case int:
  7. //..
  8. case float32:
  9. //..
  10. default:
  11. //..
  12. //..and so forth
  13. }
  14. }
  15. }

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

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

ending~~

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发