golang类型断言

一、介绍

类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"
 
func main(){
    var x interface{}
     
    var b2 float64 = 1.1
    x = b2 //空接口,可以接收任意值
     
    //类型断言
    y := x.(float64)
  //  y2 := x.(float32)  //不匹配会报错
    fmt.Printf("type:%T 值:%v",y,y)
 //   fmt.Printf("type:%T 值:%v",y2,y2)
     
}
 
##结果####
type:float64 值:1.1

  

断言时带上检测机制,如果失败不报错

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
 
func main(){
    var x interface{}
     
    var b2 float64 = 1.1
    x = b2 //空接口,可以接收任意值
     
    //类型断言
   if y,ok := x.(float32); ok {
       fmt.Printf("type:%T 值:%v",y,y)
 
   }else{
       fmt.Println("error!")
   }
   fmt.Println("end")
}
 
###结果####
error!
end

  

二、类型断言最佳实践

例子 一:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package main
import "fmt"
 
//定义一个usb接口
type Usb interface {
    //声明了两个没有实现的方法
    Start()
    Stop()
}
 
type Phone struct {
    name string
}
 
//让 Phone 实现 Usb 接口的方法
func (p Phone) Start() {
    fmt.Println("手机开始工作。。。")
}
func (p Phone) Stop() {
    fmt.Println("手机停止工作。。。")
}
func (p Phone) Call() {
    fmt.Println("手机 在打电话..")
}
 
type Camera struct {
    name string
}
//让 Camera 实现 Usb 接口的方法
func (c Camera) Start() {
    fmt.Println("相机开始工作。。。")
}
func (c Camera) Stop() {
    fmt.Println("相机停止工作。。。")
}
type Computer struct {
}
 
func (computer Computer) Working(usb Usb) {
    usb.Start()
//如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法
    //类型断言
    if phone, ok := usb.(Phone); ok {
        phone.Call()
    }
    usb.Stop()
}
func main() {
    //定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量
    //这里就体现出多态数组
    var usbArr [3]Usb
    usbArr[0] = Phone{"vivo"}
    usbArr[1] = Phone{"小米"}
    usbArr[2] = Camera{"尼康"}
    //遍历 usbArr
//Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量,
//除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言
    var computer Computer
    for _, v := range usbArr{
    computer.Working(v)
    fmt.Println()
    }
}
 
####结果####
手机开始工作。。。
手机 在打电话..
手机停止工作。。。
 
手机开始工作。。。
手机 在打电话..
手机停止工作。。。
 
相机开始工作。。。
相机停止工作。。。

  

 

例子 二:

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
package main
import "fmt"
 
//编写一个函数,判断输入参数的类型
func GetType(items... interface{}) {
    for index,x := range items {
        switch x.(type) {
            case bool:
                fmt.Printf("第%v个参数是bool类型,值是%v\n",index,x)
            case int:
                fmt.Printf("第%v个参数是int类型,值是%v\n",index,x)
            case string:
                fmt.Printf("第%v个参数是string类型,值是%v\n",index,x)
            default:
                fmt.Printf("第%v个参数类型不是上面的,值是%v\n",index,x)
        }
 
    }
 
}
 
func main(){
    var n1 int = 1
    var n2 string = "dd"
    var n3 bool = false
    GetType(n1,n2,n3)
 
}
 
###结果###
第0个参数是int类型,值是1
第1个参数是string类型,值是dd
第2个参数是bool类型,值是false

  

 

posted @   巽逸  阅读(208)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示