00:01
我们来看一下方法。前面呢,我们把结构体的使用的注意事项给大家说了一下,下面我们看一下方法。那首先我们对方法做一个基本的介绍。什么是方法呢?就是说在某些情况下。某些情况下,我们需要声明定义一些方法,你比如说前边我们不是讲过一个结,讲过结构体吗?比如说person这个结构体。那么结构体肯定是有一些字段的,对吧?有些字段,那么假设我们需要结构体,还有一些行为,你比如说person,我们需要person这种结构体呢?它有一些行为,前面只是字段,现在我们需要有行为,你比如说我们需要人可以说话,人可以跑步,人可以通过学习做算术题,这时我们就需要用到方法了。大家注意啊,方法和这个函数很相似啊,很相似,就或者说基本上都,基本上都都它的使用方法基本上都相同的,但是呢,两个概念还是有所区别的,那什么是方法呢?我这里下了一个结论,说go浪中方法是作用在指定的数据类型上的。
01:13
也就是说我们这个方法呢,是给某一个数据类型绑定的。明白这意思吧,因此自定义类型,自定义自定义类型都可以有方法,什么叫自定义类型呢?就是说嗯,只要这个类型是你自定义的,通过type来定义或者声明的,都可以有方法,而不仅仅是。Ru。明白意思吧,后边呢,我们会详细说明,那这里我们至少要明白两点,第一点呢,就是要明白方法,它是跟这个数据类型相互绑定的。这是第一个,第二个呢,自定义类型都可以有方法,而且而不仅仅只是这个structure,我们简单的来看几个案例,比方说同学们看这里我们就以这个为例吧。
02:03
同学们,你们注意观察,比如像这个。大家有没有发现这个呢?它很像函数,它非常像函数。但是跟函数不一样的地方,就好像他这多了一个这个东西,大家看到没有。前面多了一个这个部分,就是小括号里面有n number,那么这什么意思呢?就说明我们这一个这一个函数它是只能够跟这个number相互关联的,那这个呢,我们就管它叫方法了,明白吧,所以说我们说方法和函数它有很多相似的地方呢,但是概念上还是有所区别,那既然如此,我们就就来举例说明。好,同样我们先把这个基本介绍先给大家整理一下,那这块呢,我们新开一个小章节,前面讲的是结构体现在我们说说的是方法,来吧。方法我们给他一个标题二,我们来看基本介绍。
03:02
对吧,我们来说一下基本介绍,放到这里吧。那刚才老师已经把这个基本介绍呢,做了一个说明,我们把这块代把这个说明放到这来。是吧,放到这来,我们通过这个地方呢,我们强调一下它的这个概念啊小对他些概念什么叫方法。看这里。方法是指作用在。作用在指定数据类型上的。明白这一点要清楚啊,第二点,呃,第二点就是自定义,自定义类型都可以有方法。而不仅仅是结构体对吧,你你不要说诶方法,我们只有只有这个结构体有方法,别的自定义类型就没有方法了,也是不对的,这点是他这两点大家要有,要有基本认识好有了这个基本认识过后呢,我们就来看他的一些基,他的一个快速的一个介绍,比如说方法的声明和调用,你比如说这个案例,大家看这type a。
04:04
A这是一个结构体对吧?那么这个结构体呢,大家看到我这里写了一个小括号A,这个很关键,小括号A这写个大a test,那么这就说明什么呢?说明这个test这个函数只能被这个A这种数据类型的变量来调用,那么我们就管它叫什么呢?叫方法,或者这样说,我们认为我们可以这样说,A类型A结构体有一个方法叫test。诶,这样是不是就更清晰了,好,我把这个拿过来,然后呢,我们就来举几个例子。好,这是它的一个基本说明,我们在这呢做一个简单的介绍,说明一下上边对上面代码的说明,对上面这个语法的说明,来走一个。好的,那我们看第一个啊,第一点。
05:02
好,我们整理一下这个第一点。那么大家注意观察到,观察到这个位置。这这个机构是还是关键字,我把它标出来。这个这是关键字啊,这个是关键字,好我们写一下,呃,怎么说这个东西呢,怎么怎么说这个东西呢,就是对他的一个说明。这个表示啊。表示。表示一个什么意思呢?表示A这个结构体。结构体。有一个方法。有一个方法哦,叫什么呢,方法名。方法。方法名为这个test。好,这这点大家要清楚,那前面这个地方啊,怎么体现出这个方法是跟A绑定呢,就这块儿。
06:00
就这个地方啊,就是A。大写的A这括起来。诶,这方括起来就表示。这个地方就体现,体现什么呢?体现这个方法是表现test的这个方法。方法适合什呢?A这个类型,A这个结构体这个类型吧,类型。类型绑定的。好,那第三点呢,呃,好,这个有了这个基本认识过后,我们来举例说明。举例说明。好,我们来看一个案例,快速的走一个案例,就以这个为例吧,打开我们这个位置啊,先把这块删掉,这样不需要的先把删掉,好,我们新建一个。这个不需要的什么删掉。好,我们来建一个。这个文件夹,这个文件夹呢,我们就叫方法了。
07:00
DEMO。T soundd,对吧,Test啊,DEMODEMO没问题吧?好,我们新建一个文件叫MGO。OK。好,然后呢,我们。这样子。把前面这一部分通用的代码我们拿过来用一用,好吧,跟着老师思路放转述。完事,然后呢,我们新我们建一个类型叫type a,是个结构体。没问题啊,然后呢,这里面呢,我们写句非常简单的话叫什么啊,这是这是个结构体,我们定一个字段叫int,没问题吧,然后呢,我们给给谁呢?给A这个类型。他肯定是个类型嘛,绑定绑定一个方法,好,这个方法我就这样写了啊放。然后变量为A,这个A,然后这个是个B是这个相A相当于是它的一个变量名。
08:06
是这个大写的A的一个变量名,好吧,然后呢,后边可以写上它的名称,这个方法的名字,好,我们来走一个print n,我写一句话啊,这样就叫test。Test。括起来,然后呢,我这里写上A。哦,写上一输出他的一句话。a.number那有些同学要说老师这什么意思呢?因为你这个地方他会他会在调用的时候呢,这个变量就是A的这个变量呢,是个小A对吧,它会把。把它传过来,把它传过来,这这个A是哎这样子啊,为了这个好好好看一点,我把这个名字改一下好吧,这样子,不然的话,老是大家觉得有点有点奇怪,我把我把它改个名字,比如说这个地方叫name,这样简单了吧。
09:03
好是最好重新改一下,这个呢,我把它改成person。啊,Personally,那这个地方就改成personal好吧,然后这是它的一个变量名叫P吧,P好写出叫P点什么呢。这个诶好写完了。好,这就相当于给person类型绑定了一个方法。这个方法干什么呢?输出了他的名字,那我们来用一用,来用一用啊好,我先。我先来这个定义一个person实例p person。好写完了,然后P点什么呢?p.test。大家看到这个地方就叫调用方法。调用方法,那我问大家一个问题啊,同学们,我问大家一个问题,如果我现在调用的话,这个P。相当于说这个P调用test方法,这个P就会传到哪里去呢,注意听这个P这个这个实例或或者叫这个变量就会在调用的时候呢传给他。
10:11
明白意思吧,就相当于说这个P在调用的时候,就就会把自己的这个,把自己的变量呢,传入到这个位置去,明白吧。有点类似于我们在函数的传参这种感受。这种感受OK,好,既然如此,呃,那么我们在这输出的时候,因为没有给他附名字,同学们可以考虑这时会输出什么呀,是不是这个名字是空的?对吧,好,我们来运行一下。CD,我们进入到这个目录去。CD,然后到chapter。幺零。DRCD到我们的目录。刚才呢,我们写是method,好,Go wrong,命点go跑起来,这时你们可以看到确实运行起来了,但是后面没东西,没有名字,也就是说此时此刻这个name等于什么呢?等于空。
11:07
Name等于什么?大家看你在执行,Name是等于空的,为什么等于空?因为你没有给这个批复赋任何的名字,没有赋值吗?好,那我给给他赋一个值。P点注意听啊,这个很简单,但是呢很重要,那我给它附一个名字叫汤姆。没问题吧,好,相当于说这个时候P它的字段name就有值了,一旦有值,那么我在用它去调的时候,它把自己他这个这个P。这个变量对吧,这个结构体的变量就会传到这个位置来,那这个时候这里面呢,肯定就会有一个值,那么这时就会输出name等于汤姆好,我们来看是不是这样子的。好,我们执行一下。跑起来。好,我们可以看到汤姆就出来了,好,那这个快速入门案例呢,同学们我们就讲完了,那针对这个案例呢,老师有些事情,有些总结,总结的语语语言要跟他交代一下,来,我们走一个。
12:13
好,举例说明。好,我先把它放到这里,好吧,跟上老师思路啊,同学们。好,现在呢,我对上面这段代码做一个说明。对。上面的代码说明。总结和说明啊总结。那总结哪几句话?来,我们一起看一看。第一句第一个。第一个我们从这里可以看到,就是test test的这个方法。和谁和这个person类型。绑定。这一点大家应该很清楚,刚才老师已经说过了,这第一点第二点呢,要知道test的既然和和这个类型绑定的啊。
13:00
绑定。那既然如此,那么只也就是说你只能通过这个person的这个。对象哦,Person的这一个变量来调用,而不能通过别的。方式来调用啊,第2.test方法只能。只能通过什么呢?Person?的变量。它的这个类型的变量啊,就per它是个类型嘛,它是个结构体类型嘛,对吧,这个类型。Person这个类型的变量来调用。来调用。而不能。调用而不而不能。不能用什么呢?不能使用。是不能直接调用,不能直接调用也不能。也不能。不能使用其他类型。其他类型。类型的变量。来调用。
14:01
能理解这意思吧,好,那这两点怎么来证明一下呢?第来我们看一下,比方说如果你这样直接调用test,那我告诉大家,大家想这个这个意思就很难讲清楚了,因为我们知道这个test并不是一个函数。它是跟这个person绑定的,如果你这样调用的话,想一想同学们这个P从何而来,就是这个参数。对吧,这个P是谁掉进去呢,调不进去,说到这个时候呢,你一执行他会报没有,没有定义过test,没有定义过,大家看缺个缺点,看on defend test,再看这。当地所以说不能直接调用对吧,这种调用就错了,那你如果用别的类型来调用也不行,比如说你定一个dog。这个结构体。来我们看啊,这是一个结构体。对吧,这个结构体呢,假设我们有一个dog。Do这个结构体的实例,呃,结构体的变量,那你这样调用也不行,你这样调用呢,他也会告诉你do这个结构体没有一个这样的方法,我们看是不是这样子说的。
15:12
那你看我执行一下。我还没有执行就已经报错了,大家看这里说的非常清楚啊,他说dog.test on find什么意思?大家大家看这里,他说type dog。就是dog这个这个类型呢,Do这个类型还是漏,就是没有这个字段,或者没有这个方法。看到没有?因此呢,老师就提出这两点啊,既不能直接调用,也不能够用别的类型的调用好,这是错的。把这个错的呢给大家整理到这里。好,这几种用法都是错的啊。下面的使用方法,下面的使用方法方式都是。都是错误的。比如说这样调用,或者这样调用都不行。
16:02
不能直接调用对吧,好这块呢,我把它给它整理到这啊,这两种方式都是不对的。都是错的啊,我要标出来。好,这块把它整理到这儿。我们还要说第三点。第三点。注意听啊,第三点也很重要,哪一点呢,就是这我们要说的是第三点就是这个位置P。P这个person,它其实相当于我们函数的传参。它传承是从哪传进去呢?把这个变量传进去的这个P它是可以,这个名称是可以随意的,大家看这里啊,这个有点不好说,就是function。B。Person。好,Test。好,这里面我就不写了啊,就说这里面这个小P。这个名称。这个表示谁?
17:00
把它标成一个蓝色的。这个它代表是谁呢?表示谁调用我表示哪个person追听,就是表示哪个哪个变量不要用我哪个这样写啊person变量。我把这个标准混,呃,黑色的。这点很重要哦。好,他表示哪个person变量调用,调用这个P就表示谁这个P。这个P就。是他的一个副本,就是他的一个副本。他的副本。怎么理解这个东西呢?它这点和那个函数传参是非常相似的,这一点。这点和函数传参传参非常相似。那我问大家一个问题,我问大家一个问题啊,同学们,我问大家个问题,请思考,如果我在这里边把这个名字改变了。
18:05
这是肯定可以的,对吧,我把Jack,那我问大家,当我把它改成Jack过后,这个地方就是第14行会输出什么。他会输出什么?是不是他会输出Jack?对不对,肯定嘛,因为你在这把人家改变了,你当然输出Jack了。输出。Jackie,那我问大家一个问题,这边呢?如果我在这里继续去输出P点内。这个主函数里面的啊,主函数里面的这个P点内,它等于多少。同学们请思考。我们现在研究一下这个问题,因为刚才老师讲的这个p test的时候,它是代表它的一个副本,而你本身不是通过指针传的是吧,你不是一个指针,而我们也知道结构体,它在传参的时候,它默认是指拷贝。
19:02
那也就是说他在P代调用这个test的时候,其实他传了一个自己的一个拷贝给这个P。那你这里面的改变会影响到main函数里面这个P的内吗?显然它是不会的,因此这边会输出什么呢?它会输出汤姆,因为你这的改变并不会影响我,除非你传地址。除非临传地址,好,我们来试一下吧,我们来跑一跑,看老师分析的到底有没有道理。我们可以看到刚才老师分析的是很正确的,在text函数里面是Jack,在M这边呢,还是汤姆?这一点和我们的函数传承,几乎函数传承的机制是一样的,就不再赘述了,好吧,这大家注意一下,那我这个地方就是证明这一点,第四点我们注意P这个名称是可以随意的,不是固定的啊,就是P就这里面这个这个这个值其实相当于是个行参,因此它的它的变量这个名字呢,可以根据你你就可以随便写,只要你后面这个不改就行了,你后面改了就代表是跟别的类型绑定的,能明能能明白这个意思吧,好还有一点就是这个P。
20:17
好,这是个小写的P对吧。B这个。这个名行参名。可以叫行,暂时认为他是个行参吧,啊行产品这个名字,这个名字啊,名字是是可以由可以由程序员啊,程序员指定,指定不是固定的。不是固定的啊,固定的就随意,当然你后面这个不能改啊,如果你把这个person改成别的类型了,那这个方法就跟别的类型绑定了,而不再是跟person类型绑定了,能明白吧?那我给大家举个例子,比如说我把这个名字改成另外一个值,比如说我就叫做A,那如如果我把这个改成A的话,同学们,那下面这个是不是也应该改成A就可以了。
21:04
是不是这个道理啊,你看我这样运行也没有任何问题。没有任何问题吧?看完全正确。完全正确,所以说这个名字呢,就是随意啊,就是根据你的情况,你你根据你的这个。一个一个一个习惯可以指定,但一般呢,呃,这个名字呢,还是要写一点有意义的,最好不要写abcd,也不要写P,其实真实的情况下应该这么写更合理啊,就person。写个小,写的更更严谨一点,更好一点,明白意思吧,因为不然的话就感觉好,这个叫个A呀,叫个B呀,都特别不好,只是老师呢,在讲课的时候,有可能就是为了省事就这样写的,但是在我们真实的这个开发中,最好这个这个值就是行参这个名称呢,把它也写的有含义一点,这样别人一读就读到了。好吧,OK,这个其实有点像我们那个什么呀,就是像那个Java里面的Z有点像啊,有点类似。
22:04
好,同学们,我把这个就写完了。好,这一关。比如我举个例子啊,比如比如改成啊修修改成什么呢?Person也是可以的。也是可以。好的,那基本上这个概念这一块呢,就说完了,好吧,我把它。这个说明的这一部分也给大家拿过来,一样可以用。OK。没问题吧?够了。好,那关于我们这一个就是方法的声明和调用的一个说明呢,就给大家介绍到这里,包括这个方法的基本介绍也说完了,大家先把它消化一下。
我来说两句