00:00
同学们,我们来看一下接口的一个最佳实践,那前面呢,我们把接口的它的基本语法,包括接口使用的注意事项就给大家做了一一的介绍,同时呢,我们也做了关于接口的课堂练习。但是呢,毕竟我们没有把这个接口的应用。它的一个应用场景,具体的来体验一下,也就是说这个接口到底有什么好处,相信目前同学们还没有一个非常深刻的认识,对不对?肯定是这样子的,因为毕竟我们刚才讲的都是一些语法的这个层面上来讲的,那现在呢,我们来看一个最佳实践,通过这个最佳实践呢,相信同学们就能对这个接口的好处体会的更加深刻了。那么这个最佳时间是什么呢?我们来一起看一下。我们最佳时间的要求是实现对hero结构体切片的排序。哦,这什么意思呢?就是我待会呢会去写一个hero结构体,然后呢,会定义一个,呃,会会去定一个,呃,这这个结构体切片类型,然后呢,我们来对这个结构体进行一个排序,能理解我的意思吧,好,现在呢,我们来按照这个最佳接口,呃,接口的最佳实践跟大家进行这个课程的讲解,来吧,我们新建一个。
01:20
新建一个文件夹。叫CE。R exercise c对吧?那么我们写个0202 OK,那么新建一个文件叫main.go老规矩,在前面打个包包面包。面包,然后呢,我们引入需要的这个format对不对。一位要输出嘛,然后写一个主函数写完了,呃,我们先来看一下,为什么说我们要对一个hero结构体这这个切片进行排序,我们先做一个引导啊,嗯,同学们还回忆一下我们在前面是不是讲过。
02:01
对数组的排序用冒泡排序还有印象吗?当时我们是怎么讲的?是不是当时这样讲的,就是先定义定义。一个数组。当然也可以是切片,对不对,也可以是切片,这个没问题吧,那现在呢,我就以切片为例,回顾一下当时我们对这个冒泡排序是怎么用的,好吧,因为只有把这个回顾一下,然后呢,大家会对这个接口,呃,就对这个接口体切片排序呢,有一个更加深刻的认识。好吧,OK,现在我写一个切片,比如说我定义定义这个int slice这个切片。没问题吧,然后呢。我直接给他赋值了。叫int吧,然后我随便写几个参数啊啊,随便写几个元素零负10。还有。来个七,来个90,好,同学们可以看到目前这个切片。
03:03
有序没有?实际上是没有没有顺序的,是不是好,现在呢,我我请大家思考。进对它进行排序,现在要求对这个int slice这个切片进行排序。哦,我问大家一个问题,如果要求你们对它进行排序,是不是你有两个方法,第一种方式就是使用我们前面学过的冒泡排序。是不是我们前面是不是讲过冒牌排序,打开我们的这个手册。我我打开我们这个笔记,在笔记里面是不是我们讲过冒泡排序的实现,还有印象吧,一步一步怎么做的,是不是写的非常的清楚,那这块呢,我就不再讲了,不再讲了,那我现在要讲的是第二个思路,第二个思路就是你也可以。也可以使用。可以使用系统提供的方法。那有时说老师气孔提供了什么方法呢?打开我们的手串。
04:03
大家看到在这个。手册里边,大家看这个手册是从哪进去的啊,是从我们这个官方网站,大家看这是官方网站,官方网站里面有个package package里面呢有一个包叫salt包。这个烧包我们点进去。明白点进去过后。看一下啊,点点点进有有点慢啊,点进去过后,我们可以看到这里面有一个function。这个方式是什么呀?Int s,这个int s呢,它是干什么?它这个就是int s source a slice of ins,就是说它对一个int的切片进行一个排序,而且大家可以看到它默认是什么顺序啊,是不是一个顺序的啊,当然这里这边还有案例。当然还有案例,那也就是说实际上呢,我们也可以使用系统提供的方法,来我给大家走一下,那既然你要用这个方法,是不是首先要引入什么呀?Salt包这个没问题吧,那我就经常进行排序了,Salt括起来,把这个切片放进去就可以了。
05:10
哎,同学们回忆一下这个地方需不需要加地址。需不需要加地址,根本不需要。为什么说切片传输的时候就不需要加地址了呢?因为我们在前面是不是讲过,讲过一个非常基础的,就是也是最重要的最重要一点,我们在讲变量的时候,老师是不是说过切片它是引用类型,回忆一下。大家看这里。是不是我讲过引用类型?指针slash切片是不是就是引用类型啊?既然它是引用类型,各位同学请思考,当我把它传进去,是不是就相当于把这个main函数里边的这个LA传给了so方法?啊,那么既然传给他了,又是引用类型,那也就是说sort在它内部进对它进行了排序过后,排序了过后是不是就直接影响到我们这个int slice这个切片了,这个没有问题吧。
06:08
那同学们如果感兴趣的话呢,你甚至可以去看一下它这个int s原代码是怎么写的,点一下。我们就可以看到它的源代码,大家看这个地方是不是就是它的源码呀,里面它掉了salt里面的这么一个。这么一个方式去完成的,对不对。是吧,好这块呢,我们就说到这里,然后既然这样一做,我们再输出一下。我们输出看一下效果format。format.print aen,我们输出这个L,大家想一想,此时此刻是不是它已经是一个有序的了,来,我们运行一把。我们预习一把啊,诶,这还有错是吧。OK,把它放进去。
07:00
诶,它这地方哦,这个包没有没有完全引,对这个不是这样直接引一个salt的,我们来看一下它的这一方是引什么包才是正确的,大家看这里。At。SO。啊。我们看一下这个地方是什么问题。啊,这个地方我们是不是写太着急了是吧,应该有个int什么呀,Int根据前面写的。S对吧,In的S,我们看这样是不是这样写的。往这写,把这个方法找出来是ins是吧,你连函数都没掉,好这样就没问题了,那这个时候呢,我们来输出一下,同学们看LS一下,我CD到我们刚才写的这个chapter多少幺幺。在CD到它的这个目录里面去,CE02还记得吧,然后go run main.go跑起来。那这个时候呢,我们可以看到它经过这个处理过后,同学们可以看到它是不是已经是一个有序的,有序的一个梳,有序的一个切片了,没问题吧,负一零七十九十,好,这个问题我已经引出来了,那现在我要求大家做这件事情,这个没没什么问题,大家对对我们来说没有难度,对吧,现在呢,我突然要出这么一个问题,什么问题呢?我要求大家。
08:24
现在的问题这样子啊,请大家编写啊。对,一个结构体。结构体这个切片进行排序。OK,这个时候大家想一想哈,你如何对一个结构体切边进行排序呢?好,第一种,第一种思路,你仍然可以使用我们的冒泡排序,这个是没问题的。还是可以实现,大不了就是我一个一个的进行比较嘛。这个没问题,但是呢,现在我们出于一种通用性的考虑,我们希望呢也使用系统提供的方法,那么系统有没有提供这个方法呢?告诉大家系统真真的提供了它的方法是在哪里?大家看到在这有个方法还是在这个sort包。
09:11
这个sot包里面呢,它有一个方法叫so,诶我们搜一下啊。我搜一下salt。往下走。啊,这个太多了,我就直接从这看,大家看这里,大家看到没有,这有一个方法。这个包,看到这个salt包里边有一个方法就叫salt。这个so里面它接收一个什么,接收一个interface,大家还记不记得,Interface就是接口,我们前面是讲过的,那么这个接口你要给他传进去,它就可以给你排序,就说这个salt,它可以接收一个实现了这个接口的。类型的变量。那么我们看看这个接口它实现什么方法呢?大家来注意观察这个接口interface,它里面有三个方法需要实现,一个是N,一个是N,一个是swap。
10:06
那什么意思?也就是说,如果你想去调用系统提供的这个方法对一个结构体切片进行排序,那么你就需要去实现这个接口的三个方法,能理解吗?那有些同学说了,说老师为什么是题要实现这三个方法,因为他已经给我们定义定好了,那只能说他在这个方法里边,大家可以推一推,也就是说他在这个sortt方法里面,他会用到你这个接口里面提供的这三个方法,能理解吗?那有些同学说老师给我们看一下源码,好,没问题,我点击这个salt。我们可以看到在这个地方。的确,他用到了一个嫩,大家看到没有?De点嫩。是不是也就是说他在这个sort方法里面,对你的这一个data进行排序的时候,它会用到这个N,同时它默认用的是quick shot,也就是快速排序法里面呢,也会,如果我们追到这里边,追到这里边大家看他把这个data继续传到了quick shot,那么在这个quick sort里面呢,它会继续用到我们刚才所说的这两个方法。
11:19
哪两个方法一个是类似,一个是swap,我们看能不能追进去啊,我们看看能不能追进去。点下。Salt,现在呢,我们已经追到了quick sort,看看能不能找到它,我搜一下。我搜一下诶,呃,我把这个复制一下啊,同学们稍等片刻,我把这个复制一下。好,我们可以往下面拉一拉。啊,我们往下走一走。我要走一走。Quick。诶,大家可以看到这是不是有个quick shot。这个是它的源代码,它是不是也把这个data拿到了,在这个data里面呢,它执行了这么一个操作,看这个里面就是我们的快速排序法,就是勾浪里面的快速排序法的一个实现。
12:08
那在这里面呢,我们会找到刚才我们定义的另外。呃,就是说实现的另外两个方法,一个是哪里。大家看是不是这个地方类。看到没有,还需要一个swap,也就是说只要你的这一个结构体切片类型实现了它那个接口的三个方法,那你就可以调用什么呢?So的方法来完成一个对结构体切片的排序,能理解了吗?那也就是说只我不管你是什么类型啊,只要你把这这个接口三方方法实现了,你就可以实现这个排序,你看这就是接口的妙用。这就是接口的妙用,那么我们现在呢,有了这个基本的认识过后,因为前面我在讲接口的时候,我把这个东西已然给大家讲的很清楚了,对不对?那现在我们不说废话,我们直接呢就来实现一个对结构体切片进行排序的案例,大家体验一下这个接口的使用,就说这就是接口编程。
13:06
这个就是我们接口编程能理解吗?也是我们面向编程,面向对象编程里面的核心来吧,现在呢,首先第一步我们先去干什么呀,我们先去声明。我们先去声明,注意听我们先声明这个一个hero hero结构体。啊,那我因为我在这写的是嘛,我说对hero结构体对不对,好我定义这个东西。好,Hero。那这里面呢,我们给他来几个啊,当然地方应该是这样写啊,Type。Hero。好,Structure对吧,这样写才是对的,然后这里面呢,我们有这么两个字段,一个是name,当然这是我自己来定的啊,你们也可以随意,还有一个呢,年龄好吧,就是给他一个名字,给他一个年龄就行了。
14:01
这是呃,Hero结构体,第二步呢,我们再去声明一个。声明。声明一个这个hero结构体的切片类型。注意听啊,切片类型。呃,那。为什么我们要做一个这个切片呢?因为切片里面才可以放多个hero这种结构体的变量,能理解吧?好,那我就声明它一个,那这个很简单吧,Type。那我就这样写hero sce。没问题吧,Here类型是什么呢?类型是这样一个东西。Hero大家能看懂吗?这个就是hero结构体的切片类型,能看懂吧?第三步第三步诶同学们,是不是我们就应该把这个hero来时这个类型,把把它对应的这三个方法给他实现了,我们就可以传一个这个传一个这个切片变量给他,让他帮我们排序,能理解了吗?
15:02
好,现在呢,我们就来实现。实现。这个接口实现哪个接口呢?实现这个接口,它的接口的名字好,我们来看一下,诶这怎么跑跑到别的地方去了是吧。呃,我们找一下刚才在这啊实现这个接口。它的接口类型,它的名字就叫interface,没办法啊,他名字就叫它这个接口的这个名字就叫interface,那那就这样子吧,啊先interface接口。好,那么要实现这个接口,其实就是实现的三个方法,对不对,就是实现他三个方法,那没问题,我们按照套路出牌。第一个首先呢,我们把它放过来。是吧,我要对他实现。我就简写HS没问题吧,然后呢,嗯,我们实现的第一个方法是什么?N,我们看这个Les是干什么的啊,Les is the number of elements in the collection什么意思?就是它会返回一个这个结集合的呃,长度,或者说它元素的个数。
16:07
这个是不是挺简单的,好,我把这个粘贴拷贝到这边来,然后我们来什么嫩。对它进行一个长度的计算,写完了第一个就写完了。第二个我们接着来写,第二个接着来写,那我就复制一下啊,第二个函数我们再来看一下啊,第二个方法啊,第二个方法是类,这个类是干什么呢?我们来看一下,This report whether the element with index I show。Thought before the element with index girl j,那也就是说它这样会返回一个波尔值。这个波尔值呢,如果你这个你你返回的是,如你返回的是这个II,这个就是下标为I的这一个变量的值大于截,那么它就按照什么呢?按照顺序排,如果你你认为是,呃返回的是I,如果小于勾。
17:04
为真啊,就是下标为I的这个,这个元素的值小于下标为截的这个元素的值,嗯,这个为真的话呢,它就是降序排列。明白这意思吧,好,我给他做一个做一个说明啊。这个这个我就不做,呃,我就我就写到这了,大家看一下。啊,那怎么来返回呢?刚才讲过了啊,如果你这样写。现在呢?关键的问题是在这,这个就是。这个函数就是来,这个方法就是决定你到底是按什么标准来排序的,我写到这里。Nice。那。这个方法就是决定。决定决定什么呢?决定你使用。决定。你使用。什么标准?
18:01
什么?什么标准进行排序?明白啊,那假设现在我们定这样一个标准好不好,我们就按年龄,我们就按这个年龄什么样呢?我们按这个年龄这个呃,从小到大排序。啊,我们的标准是按年龄,按什么呢?按这个hero。的年龄。年龄从小到大排序,也就是升序排序,那如果是升序排序的话呢,非常的简单,你就这样写H,把它这个I访问到点,H是不是这样访问的,那么我就知道它大于它这个为真。啊,只要这个为真好,那么它这个就会按照什么呀,年龄从小到大对我们这个切片里面的元素进行排序,这点请大家一定要重视啊,这块是个关键点。我已经说的很清楚了,第三下面一个函数还我们是不是还有一个方法没有实现啊,来接着写第三一个,第三一个呢,它是叫swap swap就是去交换elements就是。
19:09
把这个I和节的这两个元素进行交换,为什么要交换,因为你你后边这个在进行这个快速排序法的时候,它会调用你这个swipe方法,它通过接口来调用的,刚才是不是已经把这个源代码给大家看过了。那我这里就不多说了啊好,我把这个呢粘贴拷贝过来。这个就是交换。那交换的时候呢,没有返回值,那就很简单,我这样写,大家看能不能看懂temp。我先把heroes的。HH就是这个I这个元素交给一个临时变量,然后。我把JHS这个节。这个元素赋给I。相当于说把它给他了,紧接着呢,我再让HS解,等于temp,这个就是一个交换,大家能看懂吧。
20:01
是不是我就写完了?也就是说现在我实现了NNE和swap,那当我把这三个方法都实现的时候,意味着我就实现了哪个接口,Interface接口,那么既然实现了interface接口,同学们请思考,是不是我就可以调用。我就可以调用你的这个salt包里面的这个sort方法。能理解吗?好,那现在呢,我们就来把这个东西,我我这已经写完了,写完过后呢,同学们,那我现在就来测试测试,看看我们的这个,看看我们是否。我们是否可以可以对什么呢?这个结构体切片,结构体切片进行排序,注意啊,嗯,那既然你要对结构体进行排序,呃,切片进行排序,你是不是先要做一些这个切片出来啊,你没有这个切片你就搞不定嘛,所以说我们先定一个这个切片。跟上老师思路。来吧。
21:00
VAR。切片类型,那我就写个叫heroes。没问题吧,就说我定义我把很多的这个hero这种变量放在这个切片里边去,那切片放的时候呢,一个一个放太麻烦了,我就循环的放入,没问题吧,我就循环放十个。我就循环放十个啊。0I小于十,我放十个I加加。那那我怎么往里面放呢?我怎么往里面放呢?非常简单,我先创建一个。对不对,我先创建一个,那这个时候我就创建一个hero。Hero这个结构体的变量。那我这样创建,大家看能不能看懂名字。我就给它来个随机数好不好,呃,给它来个来个可以变化的一个名字,那我这样写,大家看能不能看懂form.spf就是这这个地方会返回一个格式化的字符串,我就叫英雄好不好,就叫英雄。啊,名字叫什么呢,我就随意了啊,来一个百分号D,然后呢,我用一个round。
22:05
这个re是不是学过的run包下面的一个方法。叫int。啊,我们当时用这个方法是什么方法,还还有印象吗。TN是吧,我记得是TN。然后呢,给他写个100。这个就会返回一个零到100的一个随机数,OK,好,这就写完了,呃,这样子就把这个name给他了,他的名字就会变化,然后呢,紧接着我们再写个年龄。啊,再写个年龄,我再我再查一下这个有没有写对啊。应该是这样写的,来找一个。找到我们这个包包,我们包是哪个包啊?是math数学mass这个包下面的round还有印象吗?是ma这个包下面RA啊,看清楚了,下面呢,有一个in的N,没错啊,再再回忆一下in n,它会返回一个值,返回一个值是什么呢?是零到N的这么一个值,随机的,随机的。好,那我要用这个方法,是不是我还得引引一个包啊,引哪个包是不是就是刚才写的ma下面的run这个包。
23:06
OK。那写完这个过后呢,同学们,我们的年龄是不是也可以给他来一个随机数对吧?年龄我也来个随机数O了,那整个这个for循环完了过后不要忘了一件事情,忘不要忘记什么事情将。我们这个hero。End到。呃,碰到这个切片。哪里去A到我们的这个hair这个切片中,因为你你这个放进去,那不是相当于白做了吗?还记得怎么写吗?Aend回忆一下以前写的啊,这这些老师都讲过的哦,Heroes。是不是这个heroes,然后把这个hero放进去。放进去过后不要,诶这个地方怎么回事啊。这个地方不要忘了一件事情,还要接收一下。是不是还要接收一下人家,人家open的时候并没有直接改它啊,因为你这不是引用进去的,不是引用进去的,它要返回来一个值。
24:02
返回一个值,诶这样才叫最加进去,就是在heroes这个切片基础上加了一个hero,然后再返回给heroes,那这样就发生变化了,好现在做完了过后呢,我们先来看看,看看排序前。排序前的顺序注意听。顺序。那排序前的顺序呢?各位朋友,我们是不是用一个for循环就可以搞定它了,那我们用一个for。V,这块我就不解释了啊,这以前我们都是讲过的,老师就不多说了,对切片的一个便利我这就不多说了好吗?好,我把V打出来,朋友们。这个代码就写完了,我们先来看看排序前它是一个什么情况啊,这少了一个什么逗号。看看还有还有什么代码错误。哦,这儿还有错误啊,看哪里有错这。Return。Is not。Or length,我们看看这有哪个地方有问题,Function length。
25:01
Heroes啊,这个地方写错了。你怎么能写这个呢?应该是这个才对,对不对。是这个变量嘛,你不能直接把这个类型放进去,还有什么错误没有。没有了吧,没有的话同学们来跟老师运行一下。Go run。我们可以看到,我们可以看到输出的结果是这样子的。我们可以看到他的年龄根本不是有序的,875918是肯定肯定不是有序的吧,能看出来不是有序的吧?好,现在呢,同学们请看,神奇的事情就发生了。我调用这个神奇的事情就发生了,调用sort包下面的sort方法。那这个时候我就用salt.sort函数把谁放进去,把这个切片放进去就可以了。那大家注意啊,你之所以可以把这个切片放,把这个切片对应的类型放进去,是因为这个heroes对应的这个切片类型,它实现了这三个方法。
26:05
你看现在我往里面放,他并没有报错。没有报错吧?是不是没有报错,而且,而且同学们注意,如果我真的把一个方法给。注销了,你再来编译,它就会报错了。大家看这这一点是不是在前面我们已经讲过好多遍了,大家看这个错误提示,他说hes does not implement,它没有实现sal这个包包下面的一个叫interface的这个接口。这个接口也怪,它的名字就叫interface。很奇怪哈,它就叫interface,然后有个什么方法没实现,是不是swap。是不是,所以说这个时候呢,我们把这个函数打开,我们再以做,诶你看它就没报错了,好紧接着我们来看一下排序后的顺序。这是排序后的啊,看,神奇的事情就发生了,为了让大家看的比较清楚呢,我把这句话打印出来,写一句话叫做排序后。
27:02
明白排序后O了,我把这个信息输出来以后呢,请同学们认真的观察。你们可以看到一件神奇的事情发生了。大家看到,诶同学们看现在它是按照这个降序排列的是吧?降序排列诶我看我们这写的是什么顺序。哦,这个地方是降序排列的,I大于它是降序,那就改成这个吧。这样改一下是吧,改一下就是如果I小于它的话呢,它就应该是顺序了,那就是当时我把这个顺序应该搞得有点没搞对啊,再看一下。看效果确实啊,确实,那刚才老师把这个说法纠正一下,纠正一下啊,这样才是一个什么呀,顺序排列。啊,可能他在这个quick quick swap的时候呢,他就做交换的时候,你看他是怎么交换的就就知道了,他因为这样子,他如果这个小于它就是I小于它为真。
28:05
就说对的啊,应该这么理解啊,刚才我我我修正一下,就是如果你I的这个年龄小于这个高,这个为真,返回为真,那我就把这个I排在前面去。如果你这个I。跟这个节的类比比较为假,那么我就把你这个干什么呢排到后面去,那如果说我们有兴趣的同学可以追下源代码,应该也能看出来。我们追一下源代码,看看他是怎么来处理这个事情的,好吧。我们继续找到这个data。里面的一个data,诶找一下在哪里。不就不在这个包包里面去啊。在salt包。呃,我就直接这样搜一下。Salt。瘦的包下面有一个方法。是不是这个方法呀,So方法。是这。有点不好找哈,在这看一下,注意到这里面去,Lawyer里面有个quick。
29:03
Quick shot。好,我粘一下,诶这个有时候。保障啊好,我把它重新的弄一下。往下看。Quick shot啊,大家看这主要是看这这个地方它是怎么交换的,看到没有。在这儿。看到没有哦,他是这样子的类。如果说你这个为真,我就去交换,看到没有,他就去进行这个data里面swipe这个交换的方式啊,这样子的做的好,那这样子就就跟我们这个匹配上了啊,匹配上了没问题的,没问题好,这是我们这个呃,这个东西的一个,呃演示大家体验一下它有什么好处没有。可能有些同学还没有体验,他没有体会到它的好处啊,我再这么一讲,你们可能就有体验了,比如说我突然想去干什么呢?我突然想去,不用这个对年龄排序了,我想对姓名排序。我想对名字进行排序,你看我怎么改一下,因为你你明白这个地方就是它的一个标准了嘛,对吧,假设我要改成。
30:03
修改成对姓名。对姓名排序啊,我这电有点不足了啊,我稍停暂。好,你看如果修改成对这个名字排序,你看多么的简单,你只需要把这个改一下就可以了,大家看这里。我把这个注销掉。然后呢,我在这儿改成name。我把这个字段的名字也改成name。那这个时候呢,他就按照名字。按照名字这个比较按照顺序排序了,因为他说把这个小的,如果小I小于这个歌为真,那就把I排在前面去嘛,所以说这个是呢,就按照名字从呃名字这个声序排列了,名字顺序排列,看是不是这样子的走一个。我们可以看到排序后你们发现,诶真的是这样,你看名字。
31:00
是不是肾虚的?当然你要按照降序排列也可以,那你把这个改一下,是不是就降序了是吧,我这呢就意思意思啊,好同学们,我还把这个改回去。我把它改,大家领会到它的好处了吗?应该多少有有些领会了吧,因为这就是接口编程的妙用,呃,那有些东西还没领会到的话呢,你可以这样,再再再来说一下,假设我还有一个结构体。我有个别的结构体了,明白我的意思吧,有个别的结构体,这个结构体呢叫monster。那叫叫学生,叫学生student,注意听学生student。好,那学生有名字,有年龄,我再增加一个字段叫考。就是这个学生呢,他有成绩好,同学们想一想,如果我要求大家去定义很多的这个学生,放到一个切片里面去。然后呢,我要求大家对这个切片里面的所有学生按照成绩排序。按照他的成绩从低到高排序,同学们请思考,是不是你只需要把这段代码,几乎你就是把这个代码给我重新写一遍,就把这段代码。
32:04
大家看是不是把这个代码重新拷贝一份,往这给给这个student,呃,对应的切片类型给他实现了,是不是马上就可以。进行排序了,是不是因为大家可以看到,因为这个接口它的妙用就在于你只要实现了这三个方法,你只要实现这三三个方法,那别的事情就交给谁去做呢?就交给这个sort。就交给这个salt。呃,就交给salt去完成,至于它里面怎么去调用你实现三这三个方法的就不需要你管了,而且人家写的代码肯定是效率很高的。也你可以这样理解,就相当于说这种方式呢,他给你开放了一个接口,你把这个接口实现了,那别人就把你这个排序,就根据你你这个排序指定的顺序,或者是哪个字段就自动给你完成了,这是一件特别漂亮的事情,领会到了这个好处了吧。啊,我想同学们应该多少有些领会,而且我已经说到这儿了,你这有16段的结构体,你还可以别的结构体啊,你还有你还可以有别的变量啊,别的数组啊,都可以这么干。
33:07
对吧,等等等等很多啊,当然你甚至还可以在这写的条件更多,比如说我把名字,我结合名字,再结合这个年龄,想一个办法给他,给家去返回一个值,它也可以进行排序,能能明白吧,好好,呃,这一点我就先介绍到这里,大家体验一下,呃,那介绍完了过后呢,我这还有个细节要跟大家讲一下,就是你看这这段代码。这段代码是完成一个交换对吧。这个是不是完成一段,完成一个交换交换任务。能能力吧,他就是交换,这种交换呢,看起来有点繁琐,所以说你在做勾浪开发的时候,你会看到有人他是这样。这样做的。他是怎样做的呢?他是这样做的,HS非常简洁的一句话。追听HS。刀。等于HS。结。然后hi就完了。
34:02
也就是说,上面三句话可以等价于下面一句话,什么意思?他把这个勾交给I,他把这个I交给勾就完事了。就可以以这这也是等价啊,等价与上面三句话。下面。下面的一句话。一句话啊,等价等价于这个上面三句话等价于三句话。对吧,三句。三句话。这个就看你怎么理解啊,那么我这这个就是就是等等价的,那我这样一执行,大家看看是不是也可以跑起来。啊,为了让他看到效果呢,我稍微改变一点东西啊,比如说把这个英雄。改一下,因为这样呢,我才能看到有有变化吗。走,我们可以看到此时此刻他仍然是没有任何问题的,看是不是还是按照我们这个年龄什么顺序啊,按照年龄的顺序排列。
35:00
对不对。这样是不是更方便一点啊,既然我讲了这个东西了,我讲了这种这种用法,我问大家一个问题,假设面试官给你出这道题,你能不能把它给我答上来,说面试官做了这么一个题I。I。等于十高。等于20,然后I注意听啊高。等于勾I,请问如果我这样做了一个动作过后。Print。杰伦。那么我让大家做一个这样的事情,I等于。哎。解,解等于解,我问大家一个问题,请问这个时候I等于多少?它是不是也发生交换了,相当于把这个勾给这个I了,把这个I给这个勾了,那也就是说此时此刻这个地方一句话就完成了交换。就完成交换,那么这个时候I应该等于20,而我们的这个节呢,就等于多少十?没问题吧,我们跑一下啊。
36:02
证明一下这个老师的分析是不是正确的。我们跑一下,我们发现它的结果的确如此。的确,组织证证明了。好,同学们,那关于我们这个接口的这个最佳实践老师呢,就给大家讲这讲到这里,我希望同学们认真去体会一下这个接口的妙用啊,同时通过这个案例呢,其实你们自己,就是同学们自己呢,也可以去设计一些接口。对不对,所以说你看这里面其实通过这个这个接口来调用,你看啊,这个接口定义三个方法,你实现了,实现了过后呢,其实这里面核心的代码在哪里呢?还是在这个sort代码里面的这一部分。这个quick shot,你看在这个quick shot里面,其实这个quick shot才是我们这个里面的核心,因为他在这里面呢,他在这个里面又去调用了他自己写的一些一系列的排序的规则,能理解吗?所以这种方式就有利于我们写出高质量的代码,我们开放一些接口,让别人别人去用,同时呢,把最核心的这些代码呢,交给一些程序员。
37:05
呃,高手就是交给那种,呃,就是写代码写的比较漂亮的,效率比较高的人去写核心代码,把那个可以放开的部分交给别人,去提供一个接口给别人,我只需要你告诉我什么呢?告诉我长度。List和swap就行了,多好,因为这个类为什么把这几个放出来比较好呢?因为如果你把这个类放出来过后,你就可以让别人知道,就可以让别人知道,就说你是按照什么标准来进行排序。如果你把这个swap放开,你才能知道这个类型是什么,因为你这个I勾是一个下标,那你将来这个类型是一个什么样类型,就很灵活了嘛,对不对,因为我只给下标,我不给你一个类型,你到底是student的还是一个呃masterster的还是个student,我不管,我只给你下标,所以说能放开的我就放开,不能放开的我就写到我自己的这个内部去,这就是接口的一种。体现这个也是一个最经典的啊,同学们这个也是最经典的一个,呃,接口应用场景,那么我要求同学们注意听老师这个要求,我要让同学们学完这个东西呢,自己能够跟老师写一份一模一样的把这个学生。
38:15
这是个要求。将。学生就是student。Student的这个欺骗,欺骗。切片。按照。按照什么呢?按按这个成绩,按成绩从大到小排序,从大。从大到小排列。到小盆里。那这个题呢,就交给同学们了啊,就交给同学们,我把这个题的要求呢,待会我也写到这里去。这是一个课后题吧,相当于。课后练习。课后。
39:00
课后课后练习。没问题吧,这个同学们自己去做啊哦,我把这个要求已经写好了,好同学们,那关于这块呢,老师把它板述一下。把它板述一下,这是我们的源代码,我把这块不啰嗦了啊,直接把它拷贝到我们这块去,因为。内容量比较大,所以说我就不一步的截图了。把它板书一下。现在。最佳实践。我看下面是不是没有写啊好。最佳时间。最佳实践。稍等片刻,他这儿正在备份。我都调成40分钟了。是吧,他他又开始备份了。嗨。稍等。最佳实践就是接口编程的。接口编程。的最佳实践。OK。给他来一个标题三对不对?标题三,那么我们的要求呢,刚才老师已经说了,对吧,是这么一个要求。
40:07
好,那这段这个要求我们做做了,我们也把刚才代码已经写过了是吧,给他板书一下。然然,我把源代码给他拿过来。源码。源代码呢,我们就直接放在哪里。这个源代码我们就直接放在这一个表格里边去。这个老师就。不一不一个的粘了,然后呢,这有一个课后练习。接口。接口编程。编程。的课后练习。好,那这个课后练习呢,就是老师布置的这个题,大家一定要去练啊,如果你自己不去练,你光是听那么一耳朵效果肯定是不行的,对不对?好同学们,那关于接口的这个最佳时间呢,老师就给大家讲解到这里。
我来说两句