00:00
哦,我们接着来看下面的内容。刚才老师在讲到多肽数组的时候,我曾经提了这么一个观点,大家看到没有?就说如果phone这个结构体,它还有一个特别的方法叫call。那么我们希望呢,大家能够便利这一个USB,这个数组就就是这个多态数组,如果我们发现它传进来是phone。这样的变量除了调用USB接口生命的方法之外呢,还需要调用form,它自有特有的一个方法call。大家明白我的意思吧,就说除了它调用接口里边,接口里面的那两个方法之外呢,假设有一个结构体,还有一个特别他自自己特有的一个方法,我们也希望他能调用起来。但是呢,你不能这样调,你不能这样调,你不能说说老师,我直接这样调不就完了吗,大家看。因为我这个接口里边有stop和stop对不对,那现在呢,我们目前写的代码是这样子的,是usb.stop和us usb.stop你不能这样写啊。
01:11
你说老师,我要,我要,我要让他吊起来很简单吗?我直接通过USB。点Co不就完了吗?但是这样写肯定是有问题的,为什么这么说呢?因为就是说有一种情况,你传进来的USB,它有可能是。Camera也有可能是phone。人家刚才说了phone。假设我们phone里面,Phone里面有一个特异的方法call,但是camera是没有的,如果你这样直接去调用,那肯定会出问题,为什么?因为camera没有。明白我的意思吧,那就说意味着我们这地方可能会需要有一种判断,去判断你传进来的这个USB到底是一个form还是一个camera结构体变量,明白我的意思吧,那这个地方呢,就会使用到我们一个新的知识点,叫什么呢?叫做类型断言。
02:06
也就是说,要要完成这个功能,我们需要使用到类型断言。类型断言这个知识点好,那么我们就来看看什么是类型断言。首先我们先看一个需求,同学们看这面写了一段代码。跟着老师一起看一看啊,这里有一个结构体叫point。里面呢,有两个字段,X和Y表示一个点,没问题吧。这里有一个幂函数。这个main函数里边呢,它这有一段有一个空接口,然后呢,我这里定义了一个pointer。这个结构体变量,然后我把这个pointer交给A,请问这一步能否成功?请同学们思考这个OK不OK?显然这句话是没有问题的。为什么这么说呢?因为A是一个空接口,我们讲过空接口可以接收任何一个变量,对不对?所以说把pointer付给这个A是没问题的,是OK的。
03:13
那现在呢?我们有这么一个需求,我们反过来希望把这个A重新再付给一个pointer这个变量。有没有这种可能性呢?是有可能的,比如说我们在写一段代码的时候,我们希望把这个A重新。重新付给一个pointer变量,或者转换成一个point变量,这种需求肯定是客观存在的。那么同学们想一想,如果我这样写,我定义了一个b point这个变量,然后我把这个A直接付给B,可不可以?大家想这个可不可以?这个地方肯定是L。肯定是错误的。为什么这么说来,我们看代码。
04:00
来,我们试一下这个代码现在可不可以啊,可不可以这个地方我们讲一下类型,断言assert。来,我们新建一个。跟着老师思路,跟着老师思路啊,新建一个文件夹叫assert。这个就是断言的意思。那么我们新建一个文件叫main.go没问题吧,然后我偷一个来啊,我就把代码直接拷贝过来。然后呢,我把前面这一部分处理一下,打一个面包,我们pointer。Import,一个format这个包包。好,同学们想,如果我这样直接把这个A付给这个B,你们想一想能不能成功,我保存一下啊,我保存一下。我刚才已经分析了,如果你把这个A直接分给B,你看他已经报错了,他报一个什么错,大家看这里,他说cannot use a。又是又是A,这个A就说不能使用这个A。
05:02
作为一个pointer,就说不能把这个A当做一个pointer进行赋值,赋值赋给谁呢?赋给这个pointer就说他的意思就是说不能不能使用这个AA是什么类型啊?A是一个空接口类型,作为这个pointer进行一个赋值,为什么呢?他说需要一个type assertion就是assertion就是这一个什么呢?Assertion这个就是断言的意思,他说这里需要使用到一个断言。那也就是说这个地方直接付是不可以的。不可以,那有些同学说,老师这样,既然不可以,怎么处理呢?同学们非常的简单。非常简单,好,我告诉大家啊。把这个B直接付给这个A是不可以的。不可以。那怎么样才可以呢?同学们,这样写就可以了。B等于A点。
06:01
夸起来,Pointer。这个就叫类型断言,同学们这个就叫类型断言,就是说我把这个A就说他这句话什么意思呢?就是说把这个A看看能不能转换成一个pointer,然后再付给这个B,如果这个转换不能成功,肯定这这句话就会报错。如果能成功,那就成功了,这样就可以了,这样就可以了,好同学们,我们来试一下,看看这样行不行了啊点。Point。Paul。OK,好,同学们,现在我来运行一下这段代码,大家看看能不能跑起来。如果这样能成功的话,大家想这个B是不是就会输出一和二,是不是好朋友们,我们来跑一个。好,现在呢,我先切换一下CD到assert。Assert,然后呢,我们go run main.go跑起来,我们可以看到代码没有任何问题,大家看这里一二成功了,也就是说,也就是说如果我们希望把一个。
07:07
空接口,空接口这个类型重新再。转换成对应的这个类型啊,这个类型,那么我们就会使用到类型断言,这个就是我们类型断言的一个快速的引入案例,大家体会一下。就会一下啊好的,我先把这个代码呢,给大家做一个做一个板书。做一个板书啊OK。我们接着往下看。这个叫类型断言。类型断言。这点呢,这个类型断言在我们开发中用的还是比较多的,同学们。类型断言。哦,这个地方咱们不能不能叫这个要换一个类型,状元是标题二。好类型专业叫标题二,那刚才呢,我们看了一个需求对吧,一个需求由。
08:04
有。一个具体的需求引出了,引出了类型断言。类类型断言OK,那么具体来说,这个类型断言我们是怎么给大家说的呢?就这个案例。就这个案例,我们让大家看一段代码,我们发现这样是不行的,然后怎么解决的呢?大家看到解决的方法就这。大家看到没有?这个地方我们就使用了类型断言,大家看我这里有说明啊,B等于a.point就是类型断言,它表示什么意思呢?它表示判断A是否是指向pointer类型的一个变量,如果是,就转成pointer类型专验,并赋给这个B变量,否则报错。否则报错,那也就是说你这个地方也不能瞎转。
09:00
就这个A,它能转成这个point。那前提是原先你这个A的的确确是指向一个pointer这么一个结构体类型的,如果你没有指向,那肯定会报错的啊。明明白这意思吧,就说他之所以能成功,就是因为你A的确是指向一个pointer的,如果它没有指向,那你这个类型端点就会报错。明白意思吧,好了,来,我把这一段需求呢给同学们板书到我们的笔记里边去。没问题吧?好的,我把它进行一个板书。大家应该能看懂。应该能看懂啊,类型断言就是这么简单,但是我们接着往下面来讲,类型断言的一些个细节的问题,我们接着往下看。大家看现在呢,我们来系统的介绍一下什么叫类型断言。所谓类型断言是指的由于接口是一般类型,不知道具体类型,如果要转成一个具体类型,就需要使用到类型专员,具体的方法如下。
10:08
其实前面呢,我们已经用了。这个就是类型断言对不对,只是说老师在这儿再举了一个,再举了一个案例,加深对他的认识,比如说大家看这段代码。这有一个变量是FLOAT3,二。然后呢,这有一个X,大家看X是个什么类型,是一个空类型,对吧,然后我把T交给他这个地方是OK的,然后呢。我要反过来再把一个T转回给一个pointer,就是x.point in,呃,抛呃,FLOAT32就转成这个A了啊,转成这个,转成这个B,转成一个Y,这个Y是什么类型?这个Y就是FLOAT32。好,我们来给大家。走几个案例。走几个案例。好,这段代码呢,我们先放到这是类型。
11:01
类型断言的其他力。比如说吧,同学们,刚才我们写到这有一个。呃,X是个空类型,我们先定义一个。Interface这个没问题吧,然后呢,我们再定一个变量叫B,是一个float。FLOAT32。也没问题,现在呃三二我给我就直接给他一个值好吧,比如说1.1。没没毛病吧,这个没毛病,然后然后呢,我把这个B付给。把B付给X,这个没问题,这是为什么呢?因为空接口。空接口可以可以接收接收任意。接收。任意的啊,任意类型。这个没有问题,好,现在呢,我要反过来了,我要把这个X重新转成一个FLOAT32。
12:02
632,那我怎么转呢?就用类型断言。这里使用类型断言能理解啊,那我就直接转Y。直接来做,就是这我们用个类型推导。然后呢,很简单,就X。点儿,别忘了FLOAT3。好可以了,然后呢,我们输出来。我们输出来,我们看一看Y它的值是多少,它的类型又是什么?好吧,Y的类型。四。是不是这样写的?百分之T还理解吧,它的值。值是多少呢?百分V来,我们把它输一下。好,同学们,现在呢,我们跑一下这个代码,看看有没有问题。抛起来我们看效果哦,这里有问题啊,我们看哪里出错了。啊,B前面哦,是不是前面B已经定义过一次了呀,那没问题,我换一个名字吧,叫B2。
13:06
B2没有没有没毛病啊,换成B2就可以了。因为前面我已经用过这个币了,就不能再用。好朋友们,我们再跑一下。好,我们可以看到同学们,我们可以看到你重新用类型段语言进行转换过后呢,Y又变成三二,它的值是1.1,完全OK。完全OK,好,这个就是我们类型断言的第又一个类型,又又一个案例。当然了,同学们想。你这个地方能转成FLOAT32,是因为你原先X就是指向一个B2的,呃,B2又是三二,你如果转成其他类型,你们觉得可不可以?64、大家觉得这种代码转能成功吗?这是三二,这是六四,大家觉得可不可以我们来跑一下。我们可以看到,我们可以看到报错了。
14:01
报错什么?报错了,大家看这里。原因非常简单。看到没有,他说你这个空接口原先是一个FLOAT32NOT,不是一个FLOAT64。明白,所以说呢,就报了一个恐慌panic,因此我们再次强调一下,这个地方转换不是说你想怎么转就怎么转,你必须要清楚的知道你原先这个X指向的是什么类型才能转回来,能理解意思吧,比如说你转错了就会报错,就会报错,那问题又来了,说老师那我在写代码的时候,我怎么知道能够转成转换成功还是转不成功,我有没有一种判断的机制呢?没问题,也有。所以说一会呢,我们就给大家讲讲一下怎么去做一个带检查的类型断言,这个呢用的非常的多,好,我先把第一个案例给同学们板书一下啊。
15:00
板述一下,这个呢是我们类型断言的基本介绍。把它走一下啊,跟上老师的思路。好,基本介绍,刚才老师呢已经做了,我们又举了两个案例,我们又举了两个案例。第一个案例就是刚才老师在这写的这么一段案例。对不对。写的这么一段案例。在这里呢,我们要强调一点,我把这地方做一个说明,对上面代码的说明来。我做一个说明啊。对上面代码的说明。重要的一个说明,请跟上老师思路。说明什么呢?就是在进行类型断言的时候,在。进行类型断言。断言时。要确保要确如果如果啊,如果这个类型不匹配,它会报错,如果类型。
16:01
不匹配。不匹配。就会报错。就会报一个什么呢,它会报一个panic。什么panic,就是刚才老师给你们看到这个东西,就这个。就这个看到没有。就是说你这个空的这个接口是一个FLOAT32,但是不是一个六四,也就说你一定要确保它的类型是匹配的才可以,对不对,因此。因此,因此进行类型断言。内心断言时。断延时要确保,要确保类型匹配,确保。确保什么呢?原来的原来这个空接口的类型空接口。空接口。指向的指向。指向。的就是就是转换就是对应的啊,要确保原来空接口指向的就是要转换的。
17:10
指向的就是要断言的类型吧,断言的类型啊,这样就更清晰了。啊,比如上面这个你就不能写成FLOAT64啊,六四就不能写,那现在呢,我们来再来看一个案例,就是怎么样进行类型断言的时候呢,待检查,这个呢用的也非常多,好我们来看看完成下一个案例就是如何。如何在进行断言时。断言时。带一个检查带检查带检测机制。带上。带上检测机制。检查机制也可以啊,叫检测。检测机制啊,如果如果能成功我们就成功,如果失败了就算了啊,看看如果成功成功就。
18:00
就OK,否则否则呢,也不要泡,也不要去抱一个恐慌,否则啊,否则也不要。也不需,也不需,不要抱一个恐慌。Bo。抱恐慌。报一个panic,因为因为这个老报一个panic克的话呢,这个毕竟还是不是一件好事,对不对,你老老报一个panic克,你这个看起来很很麻烦,所以说呢,如果成功了就OK,如果失败了怎么办呢?你就直接给我返回一个转换失败的这么一个标识就行了,你不需要给老报一个panic panic克,那程序就没办法再继续运行了吗?很麻烦的。好,那么我们来看这个案例。这个案例呢,非常简单,大家看。我就以这个案例,就在这个基础上改一改就可以了,那同学们看怎么改,就在这个基础上啊,比如说。比如说现在呢,我们就用它来做一个类型钻研。
19:01
来带检测的类型专业。我把这个先注销了好吧。先注销了。我们再举一个案例,叫待检测的。类型专业。叫什么呢?带检测。好,非常简单,你看啊,假设我这儿就要转成六四。可是这样写呢,大家都知道,你这样直接运行它,抱一个恐慌,很难看。对吧,代码就可能程序就直接退出了,下面的代码不能执行了,你比如说。比如说同学们看。我在这里。我在这里还写了一个。其他的话,比如叫做o OK okok。大想,因为你在这个地方进行这个断言就已经失败了,你这个OKOKOK,还能输出来吗?也就是说这个程序可能在这就已经崩溃了。但是我们也不可能,有时候我们可能有这样一种机制,就说你转换成功,你断言成功就成功,失败了就算了,但是代码呢,你不要给我直接崩溃,是不是有这样的类似的需求啊,你看现在我们再来执行。
20:13
你看下面那句话能输出吗?我们可以看到根本就没有输出,他在这个第三十五行就直接退出了,三十五行就这里直接退出了,那我怎么办呢?来,我们来做一个断言判断。可以这样写。我用一个变量来计收。我看看到底成功了没有,对吧,这个也可以叫flag啊,这样有有个这样的东西啊,OK,注意这个是一个变量。这个变量你可以随便写,你也可以写成flag。或者叫叫这个OK都可以好,那现在呢,这个地方我们就可以这样判断,如果。如果OK,等于处。就说明断言成功,那么我们就可以这样写了。
21:03
就说OK了。对吧,转换成功就写一句话,转换成功了。追听见花,我们叫做convert。OK。Convert。没问题吧,这个叫转换成功,否则怎么样呢?我们就说转换失败就完了。但是程序我们该怎么走还怎么走就完了。对吧,下面比如说下面还有其他代码,我希望他也能够正常的运行。比如说我们这个,呃,比如打一些继续执行。没问题吧,继续执行,那同学们看这段代码有什么好处呢?就是说它在这进行这个断言的时候,就说尝试着把这个X转成的六四并付给Y,但是呢,它这个方是是带检测的了,带检测。这个就是带检测的了。如果你他发现没有没有这个成功的话,这个OK返回的值呢,就是一个false,那false的话呢,他直接告诉你转换失败就完了。
22:11
明白,但是代码呢,仍然可以往下继续执行来,我们运行一下。跑起来我们可以看代码。同学们可以看到这里。Convert失败了,但是代码可以继续执行。对吧,所以说他并不会因为你的一个类型断言失败了而导致整个程序崩溃,所以说这个检测机制呢,还是比较OK的,比较好的,呃,当然大家看我这里这样写,其实有点画蛇添足。因为你这个OK本身就是一个布尔类型,所以说在这里进行一个判断没有意义,对吧,直接就。OK就行了,就说如果他成功了,这个OK,这个就会是处,如果失败了就是什么呢?就是boss就这么简单,那那你看我把这个改成正确的三。
23:01
再跑起来,这次就会转换成功。是吧,Y的类型是什么什么,继续执行没问题,那这样写呢,还有一种写法就是除了这种写法之外呢,呃,有些程序员go让程序员喜欢写的更加简洁,他喜欢这样写,大家看啊。剪接版的卡直接。写到这儿,来一个分号。这样写大家,大家能不能看懂。就说我把这句话直接放在一府这个地方,然后用分号隔开这种写法,我们在前面讲一府分支的时候,其实是用过这种类型的,呃,这种写法的还有印象没有,这种写法也是可以的,能理解。好的,我把这个呢也写到这,就有些程序员喜欢这种写法啊,喜欢这种写法,当然这个呢也是个人的习惯而言,就是你习惯刚才那种写法,你就用老师刚才写法,你如果觉得这种写法比较简洁,你也可以写在一起。
24:04
好,我们来再来跑一下,我们再来跑一下,换一个值。2.1,我们看看能不能运行成功。跑起来。好,可以了,大家可以看到。FLOAT3,二值是2.1,完全OK。完全OK,好,同学们,那关于我们这一个类型断言的一个。基本的说明我们就介绍到这里,下边呢,我们再来讲一些类型断言的,这个叫最佳实践,好吧,大家体验一下啊,来,我把这段代码。就是带检测的呢,也给同学们板述一下。也给同学们满足一下。带检测的类型断言,这个在我们开发中用的也是蛮多的。没问题吧?好,那关于这个类型断言的第一部分,我们就先给同学们介绍到这里。
我来说两句