开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:类型断言的最佳实践(1)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9707
类型断言的最佳实践(1)
一、类型断言的最佳实践1
在前面的Usb接口案例做改进:
给Phone结构体增加一个特有的方法call(),当Usb接口接收的是Phone变量时,还需要调用call方法。
运行代码。
将多态代码复制,增加代码
func (p Phone) call(){
fmt.Println(“手机 打电话..”)
}
call这个方法在接口中没有定义,是phone结构体独有的,camera中也没有。把上面代码改为:
func (p Phone)call(){
fmt.Println(“手机在打电话”)
}
//遍历Usbarr数组
实现如下功能:
在前面的Usb接口案例做改进:
给Phone结构体增加一个特有的方法call(),当Usb接口接收的是Phone变量时,需要调用call方法。
//phone还有一个特有的方法call(),请遍历Usb数组,如果是phone变量,除了调用Usb接口声明的方法外,还需要调用phone特有方法 call.=》类型断言
写一个computer结构
type computer struct{
}
Func(computer computer) Working(usb Usb){
usb.start()
usb.stop()
}
目前的写法与之前相同,调用程序,开始遍历数组。
var computer Computer
for index,v:=range usbArr{
computer.Working(v)
}
程序运行结果为
继续执行...
D:\goprojecet\src\go_code\chapter11\assert>go run main.go
<1 2>
convert success
y的类型是float32 值是=1.1继续执行...
D:\goproject\src\go_code\chapter11\assert>go run main.go
<1 2>
convert success
y的类型是float32 值是=2.1继续执行...
D:\goproject\src\go_code\chapter11\assert>cd..
D:\goproject\src\go_code\chapter11\assert>cd assertapply01
D:\goproject\src\go_code\chapter11\assert>assertapply01>go run main.go
手机开始工作。。。
手机停止工作。。。
手机开始工作。。。
手机停止工作。。。
相机开始工作。。。
相机停止工作。。。
D:\goproject\src\go_code\chapter11\assert>assertapply01
上述手机/相机 开始/停止工作是正常的
为了结果美观可以换一行,程序如下:
var computer Computer
for index,v:=range usbArr{
computer.Working(v)
fmt.Println( )
}
运行结果如下:
继续执行...
D:\goprojecet\src\go_code\chapter11\assert>go run main.go
<1 2>
convert success
y的类型是float32 值是=1.1继续执行...
D:\goproject\src\go_code\chapter11\assert>go run main.go
<1 2>
convert success
y的类型是float32 值是=2.1继续执行...
D:\goproject\src\go_code\chapter11\assert>cd..
D:\goproject\src\go_code\chapter11\assert>cd assertapply01
D:\goproject\src\go_code\chapter11\assert>assertapply01>go run main.go
手机开始工作。。。
手机停止工作。。。
手机开始工作。。。
手机停止工作。。。
相机开始工作。。。
相机停止工作。。。
D:\goproject\src\go_code\chapter11\assert>assertapply01
在Func(computer computer) Working(usb Usb){
usb.start()
usb.stop()
}中加一段代码变为
Func(computer computer) Working(usb Usb){
usb.start()
//如果usb是指向phone结构体变量,则还需要调用call方法
usb.stop()
}
usb.call()无法运行,camera中没有call接口,运行结果为usb.call()undifined。
Func(computer computer) Working(usb Usb){
usb.start()
//如果usb是指向phone结构体变量,则还需要调用call方法
//类型断言
usb.stop()
}
把usb转换为phone
If phone,ok:=usb.(phone);ok==true{
Phone.Call()
}
如果usb在进行类型断言成phone成功了就去执行,没有成功就放弃。
如果是手机就进入if调用call,如果不是手机,类型断言就失败,继续执行其他方法。
ok==ture部分可省。
执行程序,结果如下:
继续执行...
D:\goprojecet\src\go_code\chapter11\assert>go run main.go
<1 2>
convert success
y的类型是float32 值是=1.1继续执行...
D:\goproject\src\go_code\chapter11\assert>go run main.go
<1 2>
convert success
y的类型是float32 值是=2.1继续执行...
D:\goproject\src\go_code\chapter11\assert>cd..
D:\goproject\src\go_code\chapter11\assert>cd assertapply01
D:\goproject\src\go_code\chapter11\assert>assertapply01>go run main.go
手机开始工作。。。
手机在打电话。。。
手机停止工作。。。
手机开始工作。。。
手机在打电话。。。
手机停止工作。。。
相机开始工作。。。
相机停止工作。。。
D:\goproject\src\go_code\chapter11\assert>assertapply01
可发现相机仍然可以正常进行,类型断言失败,ok返回到boss,不影响整个程序的进行。
phone只是变量名,可以修改。