00:00
我们来看一下接口的注意事项的第二部分啊,我们先看这个啊,就说一个自定义类型呢,可以实现多个接口。也就是说我这个自定义类型,我可以实现A,同时又把B接口同时实现了,那我们来看看这个案例,好吧,来体验一下。它可以实现多个接口。第六。好,呃,那么我举个例子,还是在这里举例,好吧,还在这个地方举例。我我就这样写,这有这么一个接口啊,同学们看type。我这有个A接口了,我再写个B接口好吧。Face。然后呢,它是interface。我给他来一个方法,叫做哈吧。好称。没问题吧哈,这个方法那大看A接口和B接口,一个是C,一个是hello,那我现在呢,有一个类型,比如说type。
01:03
Type呢,我写一个叫做monster,我就是四个亿啊monster。那master它是个结构体。好,我想让这个monster呢,既实现B接口,又实现A接口,好,那我就这样写了,那就放。然后然后呢,我们这个地方有一个m master对不对,然后呢,我先写个hello。诶同学们看这个时候呢,我们就把B接口里面哈给实现了。走一个。那。Print,好,我写到这里来,就是hello。对吧。我们叫monster里面的hello。Monster里面的哈,没有问题吧。然后呢,我们紧接着再来做一个动作,就是我想把什么呢,我想把这个C方法,C方法也实现好,我写个C方法,那我告诉大家,此时此刻呢,这个monster这个结构体就实现了A接口和B接口,我们来用一下。
02:04
测一下就是monster。Monster实现了a interface。英特尔。Interface和什么呢?B interface这两个接口都被它实现了。没问题吧,那怎么来证明这个事情,就是他实现了两个接口呢?可以这样写一下,比如说我。我去创建一个monster这个实例,比如说VR monster。这是一个monster。结构体的实力对吧,然后呢。我我把这个付给付给这个接口,一个是A这个接口啊,我就四个亿。A,比如说这个地方有点不好写了啊A。前面我看已经有这个东西了,那我就。那我就怎么写呢。那就A2吧,啊A这接口A2。
03:02
它是类型是a interface。对吧,然后我把这个monster给他,你看这个是没有问题的。同时呢,我还想把这个给B这个接口,比如说B2。B interface。你看我把这个也给他了。你看他也没报错,而且呢,我还可以把它吊起来。我用A2。去掉哪个呢?C方法,因为A接口里面是不是有个C方法呀,调起来同时呢,我用B2去掉哈这个方法。大家看到。这样子就能运行起来,我们跑一下。好,我们可以看到monster把C方法吊起来了,Monster把hello调起来,那也就是说我们这一个monster呢,它实现了两个接口,大家看你通过这个案例,就是老师在对接口讲解的这种这种细节分析的时候,你会你会发现就是勾浪里面这个接口的实现啊,它非常的灵活。
04:02
耦合性很小,就他他很灵活,他因为为什么他灵活呢?因为你从这个分析你可以看到够设计者他在接口实验的时候,他最大的一个差别在什么地方,跟传统的o op里边最大的差别就是它是基于这个函数啊,它是基于这个方法来实现这个接口的,而我们像Java呀,Do net呀,或者PHP啊这些呢,它是显示实现,就是他必须指定我去实现哪一个接口,但是对他来说对这个。对于我们这个工浪来说,他根本不关心你是实现哪个接口,他只关心你写的哪个方法,看到没有。有点意思吧。那你看这样子两个接口就实现了,明白好这个呢,我们把它给大家整理到这里啊,一个自定义类型可以实现多个接口,好我把代码给它整理一下。好,这段代码呢,有个B,那我把这个A这个吗,是不是往下拿一下啊。一下。好,呃。
05:01
嗯,我看怎么把它板书一下比较好。放到这来,放到这上面可会不会出错啊,会不会出错我保存一下看看。没有没有出错是吧,没有出错那就OK了,ABA接口,B接口,然后monster把那个都实现了好。这样我可以把它代码粘过来了,它实现的这一段代码,我们把它放过来。对吧。大家从这里可以看到这儿。是不是master实现了A?Monster实现了C,那就相当于说把A接口和B接口怎么样都实现了。那既然你都实现了,当然我在用的时候呢,对不对,我就比较灵活。怎么做的呢?大家看到。在这里。对吧,我把monster实现的A接口,我可以把实现的这一个monster这个变量交给A接口,也可以交给B接口,但是注意啊,你交给A过后,你a2.c这个方法是可以的,但是你不能用A2去点这个哈,因为你这个接口里面是没有这个哈方法的,明白好这一点大家注意一下。
06:08
好,放到这儿。调用。好,这是我们所说的这个细节,然后呢,我们就接着往下看下一个第七个细节,高档接口中不能有任何变量,这一点大家一定要清楚啊,因为有有很多的oop编程里面呢,它接口里面是可以有常量的。对吧,它可以用常量,但是在我们这个勾勒里面呢,它不允许有任何变量。你给他一个name,这些都是错的,这个我就不去举例了,好吧,我直接把它粘过来,大家大家知道这个事情就可以了,你你可以试一下,比如说我在这个接口里边,A接口里面,我随便写个东西,比如说name。Name。对吧,我写个类型,你这一保存就报错了,大家看他会报一个什么错误,看这里他说语法有个错误,看到没有,他不让用啊,不能这么用,他就不,他就不能让你放这个,放这个变量进去,你不管是什么量,它都不让你放,对吧,不能放变量,好这个大家注意一下,呃,第八个细节我们来看一下这一个接口,比如说A接口,它可以继承多个别的接口,就它可以继承多个别的接口,比如说B和C,这时如果要实现A接口,就必须要把B和C的接口方法也全部实现,也就说接口之间呢,它也可以有这个继承的关系。
07:23
那这一点我把它给它整理一下。那举个例子,比如说呃,这个代码是越来越多了啊,越来越多,要不这样子吧,我们还新建一个文件夹,不然都放到一起。这个代码就比较难看好吧。我这写一个叫做。Interface。的detail。二。好,然后呢,我们来写一个主文件对吧,没点够。好,我们看一下这个要注意的地方啊,Package。转速。然后呢,有个import。
08:00
对不对,然后我们写个function me。那我们走一下吧,同学们走一下,嗯,怎么个意思呢?大家看这里看这里,他说这个A接口可以实现,可以继成多个其他的接口,那我就开始写了吧,那就开始定义啊,我有个这个B。B。Interface。Interface,这是一个接口。注意听啊,这些都非常重要,同学们啊,就是你后面做区块链开发的时候,这些基础如果如果不过关,那么你在遇到一些稍微复杂一点的代码,你你就看不懂了,那我这简单写一下他零一。这是一个方法TEST0,我就写写一个吧,好吧,这这速度稍微快一点,然后呢,这个地方呢,有一个再来一个接口叫BC接口,它这里面呢,也有一个T02。好的,现在呢,我还有一个。接口叫。叫A接口,这个A接口呢,里面它继承了什么呀?B接口和C接口。
09:06
大家看到没有?同时呢,他有自己的一个方法。比如说它有一个方法叫TEST03。大家看它有个方法叫test等于三好,大家看这里就说我这个A接口里面有两个接口,相当于说我把这两个接口继承下来了,明白,那这个时候如果你你要去实现这个A接口,就意味着你要把TEST03,还有B和C里面所有的这个方法也都要实现,那我举个例子。啊,就说如果我们我们我们需要啊,需要实现A这个接口。那就需要干什么呢,就。就需要将。将什么呀,将这个B接口。还有这个C接口的方法都实现,当然也要把A接口方法也实现啊的方法都实现。能理解,那我给大家举个例子,比方说现在我有一个结构体,比如说叫student,我是个例,然后type a structure。
10:07
然后呢,现在呢,我想让这个student这个结构体实现A接口,那我就要这么去做了,注意听。Bank。好,然后呢,我写个sto,好sto。然后呢,我要这么去实现TEST01。哦,这个呢要写进去好,紧接着呢,我还要实现什么样TEST02。你你不用去管这个TEST01是谁的啊,但是你一定要把它的方法找到,就你不用显示的告诉别人说,哦,这是这个TEST01是A接口的,这个TEST02是这个这个C接口的,你你不用这样子,只要你把方法找到就可以了,能理解。好,然后呢,再来TEST03好,只有你把这三个方法都实现了好,那么这个时候student这个结构体就实现了A接口缺一不可。那么我们来看看是不是这样子的呢,来做一个案例,然后说现在呢,我我创建一个student的这个结构体。
11:07
啊,空的就放这,诶我们就是sto吧。ST。对不对,然后呢,我现在给把这个变量交给谁啊,我把这个变量交给这个A接口,你看他能不能接收到啊,A a interface。好,我把这个student交给他,大家看代码有没有问题,我。执行一下点P,那我就调一下啊,调a.test。零一。看一下代码哪里有问题。哦,他这里有有个小问题,他说没有用到它是吧。好,没有用到它先。先这样,诶用了呀,下面。啊,没有用啊,没有用就算了吧,没有用就算了,来我们跑一下,先看语法这张,如果语法不出错,他就可以成功跑起来。
12:00
哦,代码是写错了。在CD interface。Interface detail。S。对吧,DETAIL2好,Go run main.go跑起来,我们可以看到这个时候呢,代码没有报任何错误,对吧,说明成功,但是你试试看啊,如果说你把这个,呃,你把这个代码有一个函数实现注销了,我可以告诉大家这个地方一定会报错,因为你这个10STUDENT的不你你把这个10STUDENT相当于说你这个10STUDENT就没有实现A接口,因为你TEST03没有实现。对吧,当然你把别的删掉也是一样的,比如说你把T01去掉,它也会报错。那我们看一下这个地方提示什么信息,大家看这他说诶不能够使用这个,诶诶这个student这个类型分配给A这个接口,为什么不可以呢?因为student does not implement,它没有实现A这个接口里面的一个方法,那个TEST01。
13:01
看到没有,Test式零一,Test式零一其实就是从这个B这个地方继承下来的,是不是,所以说我们强调一点啊,同学们一定要把它所有的方法都实现。这个是没有办法的,就是强制要求啊,说一个接口必须要把所有的接口都实现。那。我们把这段代码。整理一下。啊,整理一下啊,OK,那我问大家一个问题啊,我问大家一个问题,当我们这样做了过后,请问嗯,就是这个student,它是不是也同时实现了B和C,实现了没有。肯定也实现了,我不但实现了,我还多了几个函数,就是肯定嘛,也就是说你把这个你把这个student付给这个B这个接口也是没问题的,但是你在调的时候呢,你只能调B接口里面这个TEST01这个方法你不能调零二,明白吧,这点大家一定要清楚啊,就说实际上当我们这样做完了过后,那就说这个student这个结构体类型呢,它实现了。
14:03
ABC机构全部实现了。全部实现,能理解。好,我把这个呢给同学们整理一下,整理到笔记里边去。好,这一点大家一定要认真啊,认真理解。这是第26。把它整理到里边去。没问题吧,这个代码。还是比较简单哈,还是比较简单,然后呢,我把26行的继续往下解。27行开始截取。对吧。27号开始截取。没问题。好了。OK,那么我们看第九个细节,第九个细节也很重要,它这样子的interface类型默认是一个指针,也就是说interface它是引用。它是引用类型。这点大家一定要知道啊,它是引用类型。这个没有什么可翻说interface它是个引用类型,大家一定要注意,如果没有interface初始化去使用,那么它会是一个ne。
15:03
就是你就是刚才我们所说的,如果你没初始化就直接用interface,那直接就是报一个错误。还有一点大家一定要注意,Interface,它是引用类型。跟我们前面的结构体不一样,Interface是一个引用类型,再说一遍啊,它是指针,也就是说你传一个变量,你传一个就就就相当于我们这个时候大家看这段代码。大家看这段代码啊,就是哪里呢?就是我们前面讲过interface DEMO。不在这写这个DEMO。Interface DEMO在哪去了?在这你看我们我我我们就是不是把不是把这个phone还有camera传给了这个USB这个接口吗?那我告诉大家,你传的时候,其实这个地方传的时候,它是按引用方式传过来去。因为接口它是引用类型,明白这意思吧。哎,这这点大家一定要清楚啊,如果面试官问到你说接口是什么,是什么类型的,呃,是值类型还是引用类型,那你要非常。
16:03
准确的回答他接口就是引用类型,那他当然接受的其实是个地址了,对不对?好,这点大家注意一下,我这就不举例了好吗?这这也是一个很重要的知识点。这个我再说一遍啊,是特别重要的知识点,在面向对象里面,它几乎就是核心中的核心了。后面我们还会举这个案例来证明啊,那么还有一点就是也是非常重要的一个知识点是空接口,就是interface这种空接口,它直接就是一种数据类型,就是空接口就是一种数据类型,因为这个空接口呢,没有任没有任何方法,因此所有的类型都实现空接口,换言之就是说。换言之,就是说我们可以把任何一个数据类型的变量赋给空接口。能理解这意思吧?你看刚才为什么大家看这个地方你看。这个地方。呃呃,我这这还不是啊,他这他这不是个空接口。嗯。我后面再举例吧,后面再举例就说如果你如果你有一个参数。
17:03
你有一个参数。这个这个参数呢,就是是个空接口的参行参,它就意味着这个它可以接受任何一种数据类型,明白这意思吧,后面呢,我们这个这个特性要反复的提到。那我给他举个例子。空接口,它可以因为没有任何方法,所以任何类型,所以所有的类型都实现空接口,那换言之,我们再说一下就是,也就是说,即。急,急什么呢?我们可以把任何。把任何一个变量赋给。付给谁啊,空接口类型。空接口能理解吗?那我举个例子。啊,那就在这举例啊,同学们,我还回到这个地方举个例子,比方说我现在有一个这样的空接口,呃,就是这样子啊,Function。Test。那么呃他呃,我这样写test空接口,那就这样写,就是比如说是一个。
18:04
呃,就叫T吧,好吧,就叫t inter,呃,它是这样子,不能这样写,写错了type。Interface。好,写完了,但是呢,这个T同学们看到我没有给他任何的,没有给他任何的方法,好同学们想想,因为我没有给他任何方法,我问大家看我的代码这样写可不可以。可不可以啊,注意听现在呢,我有一个T就等于T。然后我把这个student给他,你们觉得我把student给这个T可不可以?显然这是可以的,为什么这么说,因为你这个T,你这个T是个空接口嘛,那就说明我可以接受任何数据类型呢。对不对,那也就是说是可以你可以这么认为,就说你可以认为student就默认实现了空接口,能能这样理解吧,所以这样写是肯定OK的。肯定OK。保存一下。没有任何错误,诶,但这这个报什么错啊,那他说没有用啊,没有用过,那那这个不算错啊,我们把它输出来打印一下,这个空接口打出就是空的嘛,大家看一下。
19:10
Fmt,那这个地方是不是没有打开啊。打开一下。看一下。大家看到没有任何问题,空接口,而且呢,你也可以这样用,说老师我除了这种使用方法,还有这种写法也是可以的,直接VRT2。有些人是这样写的啊,同学们,T2。然后呢,他就直接用这个类型。这个这个也是一个类型啊,就interface空空这个类型,就直接可以这样写明白吧,然后你也可以把任何一个值给他,比,比如说啊把这个谁呀,把SQ给他也是可以的。任何类型都可以给他好,我输一个T2。大家看没有任何问题,抛弃了仍然是可以的,两个空接口,好,那当然有些同学老师我能不能给这个T2,嗯,其他数据类型呢,也可以,比如说T2你给他一个这样的值。你给他一个float变量也可以,比如说我这里有个VVR,我就随便写啊呃,有一个NUMBER1NUMBER1,注意听FLOAT64,这这点这个知识点很重要啊,同学们再说一下8.8。
20:13
那么我把这个NUMBER1给他,大家觉得可不可以?显然也可以,为什么我再说一遍吗?因为他是个空接口,我随便给对吧,我可以把NUMBER1给这个T2,我甚至可以把NUMBER1给这个T都可以,因为它也是空接口。对吧,T是个空接口,这课T2,我这定义的类型也是空接口,所以说这个类型和这个T是什么呀,是等价的。明白,你看我跑一下啊。这个这个时候你让我跑一下,你会发现,诶,这个时候就输出一个值了。看到没有?是不是输是个8.8呀,哼,就相当于是个整数,同时你也可以这样写说老师我把这个把这个NUMBER1给他,是不是也可以,也可以啊,也可以,因为这个T它本身也是这个T,小T是这个大T的类型,而大T呢,也是个空接口,所以说你把number啊,把NUMBER1给他也是OK的,我们把它输出来一下。
21:04
那就意味着对方会输出两个8.8,是不是两个8.8,看到8.8没问题,这点是用的很多的啊同学们,就是我们可以把任何一个变量赋给一个空接口这个特点,这个特性我们在后面用的非常的多。非常非常的多啊,因为他可以接受任何一种数据类型。好,这一点大家一定要重重视好,我把这个呢给大家核心代码给大家放过来。啊,怎么写的呢?啊,就这样子。对吧,这我们定了一个空接口。这个就是一个空接口。写到这里来,这是空接口。空接口没问题吧。放这儿。好放这,那我们在用这个空间格的时候是怎怎么用的呢?大家看下面的代码。下面我们使用一下空接口,我们是这样用的,对不对。核心代码就这么一点儿。
22:00
对吧,我把什么呀,我把这个sto。我把SK直接给了一个这个空接口。对不对,我也可以把ST直接给这种空接口也是可以的,那么我甚至可以把一个基本数据类型给T2或者给T,因为T2和T也就上面这个值,对不对,它的类型就是空接口,好,这是可以的。把这放这儿,就是再强调一下啊,这方用的很多。把这句话写到就是呃没有任何方法,所以空姐,所以任何一个类型都实现了空接口加强,即即我们可以把呃就写出了任何。任何。我们看可以把任何一个变量赋给空接口。把任何一个变量赋给一个空接口好的。这一点就是我们要特别强调的好,同学们,那关于接口的细节,第二部分老师就全部给大家介绍介绍完了,那么我可以这样讲哈,就是说只要把老师讲的接口的这些个细节都掌握和把控了,那么在做项目里边语法层面上几乎没有问题了。
23:07
啊,当然呃,在逻辑层面上我们还要加强,比如说呃,怎么去用这个接口去实现更多的功能,那在我们最佳实践里面还要用到这个接口,它这接口后面用的会会非常多啊,会非常多,OK,那这一块呢,我们先给大家介绍到这里。
我来说两句