系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 脚本中心 > 其它 > 详细页面

Golang 类型断言的具体使用

时间: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
}

运行结果:

二,类型判断:type-switch

这是另一种类型判断的方法,此方法和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 类型断言的具体使用的文章就介绍到这了

分享到:

相关信息

  • VS Code安装go插件失败原因分析以及解决方案

    vscode安装go插件时,由于各种原因,在安装插件时总是失败,下面这篇文章主要给大家介绍了关于VS Code安装go插件失败原因分析以及解决的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下...

    2022-09-12

  • Java PTA 计算3到7位 水仙花数实例

    PTA计算3到7位水仙花数 水仙花数的Java实现 要求输出所有在m和n范围内的水仙花数 代码还能优化...

    2022-03-01

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载