类型断言的最佳实践(1)|学习笔记

简介: 快速学习类型断言的最佳实践(1)

开发者学堂课程【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只是变量名,可以修改。

相关文章
|
6月前
|
安全 编译器 C++
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
88 0
|
存储 安全 编译器
原来可以这么玩!Go语言类型断言高级应用技巧发现
原来可以这么玩!Go语言类型断言高级应用技巧发现
86 0
|
3月前
|
存储 安全 程序员
|
6月前
|
JavaScript 安全 编译器
TypeScript中类型断言的使用与风险
【4月更文挑战第23天】TypeScript中的类型断言用于显式指定值的类型,但在不恰当使用时可能引发运行时错误或降低代码可读性。
|
JavaScript 编译器
TypeScript-never和object类型、类型断言概述
TypeScript-never和object类型、类型断言概述
56 0
|
JavaScript 编译器
TypeScript 联合类型(|)、类型断言(<>、as)
TypeScript 联合类型(|)、类型断言(<>、as)
55 0
|
Python
python的unittes框架的断言类型有哪些,如何断言
python的unittes框架的断言类型有哪些,如何断言
|
存储
符合类型相关知识点
符合类型相关知识点
61 0
|
JavaScript 前端开发 编译器
TypeScript入门之类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名
TypeScript学习过程中经常会看到类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名,这几个概念到底表示啥呢?你真的搞清楚了吗?今天我们就来盘一盘它,帮你一次性弄懂。
305 0
|
测试技术
测试中进行断言是什么意思?底层原理是什么?
测试中进行断言是什么意思?底层原理是什么?
1381 0
下一篇
无影云桌面