类型断言

1.1 断言基本介绍

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

image-20240523153833339

上面代码说明:

在进行类型断言时,如果类型不匹配,就会报panic,因此进行此类型断言时,要确保原来的空接口指向就是断言的类型。

如何在进行断言时,带上检测机制,如果成功就ok,不成功也不要报panic。

image-20240523155956143

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main

import "fmt"

//定义了一个名为 Usb 的接口,包含两个方法:Start() 和 Stop()。任何实现了这两个方法的类型都实现了这个接口
type Usb interface {
//声明了两个没有实现的方法
Start()
Stop()
}

//Phone 和 Camera 类型都实现了 Usb 接口的方法。Phone 类型还有一个额外的方法 Call()。
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("手机 在打电话..")
}

//Computer 类型有一个方法 Working,接受 Usb 类型的参数。
//在这个方法中,调用了 Usb 接口的方法 Start() 和 Stop()。
//通过类型断言(usb.(Phone)),检查 Usb 参数是否为 Phone 类型,如果是则调用 Phone 类型特有的 Call() 方法
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()
}

//主函数中定义了一个 Usb 接口数组,可以存储 Phone 和 Camera 类型的实例。
//通过遍历这个数组,每个元素都被传递给 Computer 类型的 Working 方法,从而演示多态行为。
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()
}
//fmt.Println(usbArr)
}


/*
手机开始工作。。。
手机 在打电话..
手机停止工作。。。

手机开始工作。。。
手机 在打电话..
手机停止工作。。。

相机开始工作。。。
相机停止工作。。。
*/

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!