00:00
我们来看一下创建结构体变量和访问结构体字段的四种方式,前面呢我们已经讲过一种方式了,就是VR,然后呢是结构体变量的名称,后面是结构体对吧?第一种方式我们前面已经做过了,所以说这块呢就不讲了,那么还有一种方式呢,大家看到有时候你会看到有人这么去用。就是前面呢是VR person,然后这个结构体的名称,呃,结构体。这个这个类型名,然后person里面这边是个大括号,大括号里面也可以带值。也可以用好我我把这个案例给大家举一个例子,好吧。然后同学们看,我把这块呢,给大家整理到我们的笔记里边去。就是创建结构体变量和访问结构体字段的几种形式。好,我给他一个这个三号标题,诶这地方是在保存啊OK。
01:02
那方式一方式二,我们分别的给大家做一个案例演示。第一种对吧,第二种。好,我们来看看他的具体的案例,我们先看第一种啊,第一种这块呢,因为前面已经讲过了,这就不说了啊,前面。前面我们已经已经说过了,说过了啊说说这里就不再多说,那这块呢,又是一种方式,就是它直接这个写个person,后面呢一段大括号也可以,同时呢,这个大括号里边,你也可以直接把字段的值写进去,我给大家演示一下。好,那这块呢,我们新建一个文件夹。叫什么呢?叫structure结构体的这个创建。Great。好吧。那现在呢?我们先写一个文件,叫main.go。Go,好的。
02:01
OK,那现在这块我们把它这一部分共用代码粘过来,对吧,放me。OK。好,我们说的方式一刚才已经说过了,那么我们说方式二。方式二我们每一个举个例子啊,方式二比方说现在呢,我有一个啊,一个结构体这样定义的type。Person。A person,然后他结构dru。嗯,它有几个字段呢,比如说有名字对吧,是最类型的,再给他一个age就行了。或者他的就这样写个age就完了啊好,我们看第二种方式,它是怎么做的呢?他可以这样写VR,甚至也可以直接这样做,就是比如说PP。对不对,P p2吧。类型推导,然后呢,Person,诶这样也可以。注意,当你这样做的时候,其实就已经创建好了,它里面已经有默认值了啊,我们输出来看一下。
03:02
然后呢,P2。走。我们来运行一下CD,点点上一节,然后CD到我们刚才写的这个structure创建。对不对,然后go run,命点go跑起来。这效果。是不是他这个时候其实也有默认值了,当然你这个时候呢,也可以这样赋值说p2.0。等于,比如说汤姆对不对,p2.h等于18,那这样子呢,就会有新的值进去,就是根据你你的复制情况,它会把值放到相应的这个字段里边去,你看。对吧,汤姆18,甚至呢,有些人这样写也是可以的,说老师我能不能这样写,就在大括号里面直接把字写进去也是可以的,比如说Mary,我们知道第一个是字符串,就写个Mary,然后呢,它的age是多少呢?我就直接写个20,这也可以。
04:02
这样也就直接在创建per,在定义这个person的,直接把它字段的值写进去了也是可以的,那我给大家运行一下,请看效果,那这时候你们可以看到直接输出Mar和20对不对?好,这是我们说的第二种方式,那么第二种方式呢,给大家拿过来。好吧,把第二种方式给他拿过来,大家看一下。怎么一种用法?方式二,还有还有方式三。还有还有下面还有两种方式,我们一定也给大家讲了,还有哪一种方式呢?大家看到还有一种方式这样子的,直接返回一个指针。大家看这里方式三就是呃六用六的方式,大家都知道有些程序员呢,呃,他是学Java的,所以说在Java里边他六,呃创建一个对象,通过关键词是用六的,那在勾里面呢,它也支持六,但是六出来的实际上是一个指向person的一个指针,好,那我们来看看这个的用法好吧。
05:05
我们来看看这个用法。来,走一个。OK,我举例说明。呃,还是打开Vs code的,这是我们的方式三。写到这里来。最跟上思路。好吧,刚才输好,那我现在呢,这样做啊,同学们,我写一个P3,直接用类型推导六一个person。又一个person。好,此时此刻我告诉大家,他就是个指针对吧,所以说这样写呢,有些同学看不太懂,我就这样写,大家可能看的更明确一点,VR然心。Person吗?Person这个类型,然后呢,它是一个指针,这样就可以了,那如果是指针,我们怎么给它赋值呢?同学们,那你要赋值的话,标准的写法,因为注意听啊,因为这个P3是一个指针,因此注意听,因此标准的这个负,呃,标准的这个。
06:05
标准的复制方式是给呃,给字段,给字段。字段赋值的方式应该是这样子的,怎么写呢?标准方式应该这样写,星号P3。是不是这样子,我就找到了,我就用星号这个取值符,先把它的这个P3。P3的这个结构体变量找到,然后再点里面的name。是不是这样写,标准的写法是这样子的啊,那我给它取个名字,比如说这个叫做史密斯。史密斯,同样的道理,我给他一个年龄。年龄也给他赋一个值,比如说age。对吧,Edge,我给他多大的一个值呢?比方说它的年龄是30岁,这样也可以,那我这个就输出了for m.print LN,然后呢,把这个新P3输出,我们可以看到,这样输出过后呢,就把私密斯的信息输出来,大家看一下。
07:06
可以看到史密斯三四拿到了,但是这种写法呢,注意听这种写法呀,有点啰嗦,标准的标准给字段复制方式确实应该这么写,但是构语言的设计者呢,他做了一个简化。他做了一个什么简化呢?他说因为这种写法很不,很多程序员并不习惯,因此呢,这个go的设计者为了让程序员。我们的程序员用起来比较方便,他是做了一个简化的,他也等价于这个东西。注意听。好,我做一个解释啊。上面的写法这种这种写法。注意听啊。这种写法它是也可以等价于,也可以,也可以这样写。这样写怎样写呢?就直接不要这个了。新P3,这样写也可以。但实际上这种写法其实很难理解,因为你P3本身是一个指针,指针怎么去点这个属性呢?
08:05
这样写为什么可以成功呢?原因是这样子的,注意听原因注意听啊,原因是。Go的设计者go的设计者。他设计者呢,他为了为了程序员使用方便,他使用方便。他为了他使用方便呢,他怎么样呢?他就是因为程序员有很多习惯嘛,他觉得这种写法太太奇怪了,太奇怪了,所以说go的设计者为了程序员使用方便呢,它在底层。他在这个底层里面啊,他在底层会对会对什么呢?他会对这个东西做一个优化,他会他会他其实他是为了使用方便做了简化,可以让大家这么去用,对吧,但实际上他在底层呢,会对这种写法进行一个处理。进行处理。他会进行处理,会怎么样呢?会加上。
09:03
会给这个P3。加上。加上。我叫叫加上啊,加上什么呢。加上这个取值,取值运算。运算,也就是说他其实在你你这写的是这样子,但是实际上呢,他会把它在底层做一个处理,因此因此这个我们程序员在做这个处理的时候,其实也完全可以简化写成这个东西,能理解这意思吧。因为这个够设计者呢,其实他是做了一个简化处理,同时呢,呃,主要是为了让程序员使用方便,但标准写法其实应该是这个写法明白吧,所以说这样写它。也不会报错。等于,比如说我把这个名字再改一次,改成John。那我问大家。这种写法是给一个名字是史密斯,这种写法又把它改成卷了,那我问大家这个时候在输出的时候是史密斯还是卷呢?
10:07
显然应该是撞,因为你你先给它覆了一个值,我再重新附了一个值,相当于把前面这个值怎么样呢,覆盖了嘛,所以我们来运行一下看效果。来,跑起来,你会发现输出的名字应该是DR。对吧,那同样的道理,我们这个年龄去访问,这个年龄其实也可以这样访问,对不对,我把它改成多少岁呢?比如说改成100岁。那这个时候就应该是JOHN100岁,是不是这个道理?大家看啊。看JOHN100。没问题,那我这方主要是要给他强调标准的写法是这个,但是呢,够设计者为了让我们使用方便,它也允许这样写,他为什么可以这样写呢?因为他在编译器底层,他会在运行的时候也给我们把这个加上,明白吧,只是我们在写代码的时候,可以不用,可以可以不用知道这个事情,他帮我们做这个工作,底层会做会做这个处理,好吧,也注意这个写法好吗?好,这就是我们所说的第三种,第三种这个。
11:11
第三种创建啊,第三种创建这个,呃,结构体变量的方式,我把它整理到笔记里面去,大家看一下。OK啊,具体看用法是什么样子的。第一个就是这个去创建一个指针,然后在用的时候呢,诶这个写法,这两种写法是OK的,这个和这个是等价,下面这个呢,和下面这这种方式是等价的啊,但标准写法其实是这个。底层做了优化,也可以简写成P3点内明白吧,好,别人面试官问你的时候一定要答的上来好吗?好,我把这个呢给大家整理到这里。还有第四一种方式也给他讲一下,第四种方式呢,它也可以用爱的服务来进行这个处理,对不对?第四种方式呢,我们也给大家一并讲了。好,把它放到我们的笔里边去。
12:01
那么我们也来举一个案例。第四种方式,张一下。那么你将来在做开发的时候,到底用哪几种,哪一种方式要根据呃,根据项目的项目的要求而定。对吧,至少我们要要能看得懂,你不能说诶这种写法我就看不懂了,也是不行的。那我们来看看这个怎么写呢?老规矩,那这块我就偷一个来啊,直接把它粘过来就行了。是不是,然后呢,我给它赋值,赋值的时候,因为大家知道p person它已经是一个指针了,所以说标准的写法是这样子的。因为。Person。Person。Person是一个指针。因此。因此,标准的访问其字段的方法是。方法是方式啊,方法。方法是怎样做的呢?也应该是这样写星号。
13:03
Person。对对不对,也应该是这样写,先用个取值符找到我们的结构体,然后再点内。给他复制。比如说我给他一个名字叫Scott。这样写,但是一样的原因,但是还是一样的原因,就是go的设计者为了简化呢,简化这种写法,他也允许啊,Go的设计者,Go的设计者。设计者为了为了程序员。对吧,说为了他的程序员使用方便,使用方便。也可以这样写,也可以直接写成这个东西,就是person。Name。Name等于对吧,也可以。那原因也是一样的啊,原因也是这个在底层做了一个处理,我就不再多说了,原因和上面一样,原因和上面一样。
14:06
什么一样呢?就是底层会对它进行一个处理,好吧,会加上这个东西。底层会对这个东西进行一个处理。处理什么呢?会加上啊,会自动的。会自动。会加上。它会加上什么呢?会加上这个东西,这块我就不再多说了,好吧,那么我们来给大家使用一下,比如说person,它标准的写法应该这样写,先用一个取值符。对不对。然后呢,点name name。我给他来一个叫Scott。同样道理,Scott Scott。这个。那然后呢,我们再把这个名字啊年龄也给大家处理一下age。对不对,这是标准的写法,我们看看标准的写法,这样用了过后,我们能不能输出正确的信息,比如说88岁。
15:07
来输出一下这个。输出一下这个person来。Person取出来,好,我们来看看person是不是SC和88跑一个。我们可以看到完全没有问题是吧,那同样道理说老师,那我用这个方法呢。Person点也可以注意听啊,这些都很重要,不然的话你以后你以后完全看不懂别人写的代码。那我给大家来一个SC。一个波浪号,我故意这样改一下啊,然后呢,person.age。给他一个值,比如说这次呢,他的年龄我们写成十岁,那最后这个结果应该是什么样?号波浪号和十,因为我相当于把前面这个给怎么样覆盖了。好,我们来运行一下。跑起来请看效果,这时应该是靠的波浪号和十没问题吧。好,还有一点我要说一下,就这种写法呢,它也可以直接在这个括号里面给它赋值,也是允许的,你比如说吧,你比如说我直接给他赋一个值,比如说这地方我们叫marry。
16:12
Mary,然后呢,直接给他一个年龄也可以。比如说这个年龄是60。那如果我们这后面,那因为你后面重新给它赋值了,肯定就把它给覆盖了,是吧,假设我这没有这两句话注意听。我问大家一个问题,如果我没有在这后面的改变,那么我在创业的时候直接给他付了一个Mar和60,请问这是输出什么?还会是空字符串和零吗?显然不会,这时他就会输出Mary和60,因为你在创建的时候就直接给他的字段赋值了,对不对?来跑一个,请看效果。这时我们可以看到它输出的是Mary和60,注意这个细节好吗?好,我把这个全部撤回去。OK,好,我在这儿加一个说法啊,加一个说法。
17:03
就是。就是这里啊。哪里呢,就是。就是这个person后面既可以写,那我那我干脆还这样写啊。呃,我把这个先复制一下。把这边先清空好吧。先清空没没问题吧,然后我这加一句话。我加一句话。加句什么话呢,就是下面的这个话,下面下面的语句也可以。也可以直接给什么给字段复出值。复制,比如下面这种写法。对,这样一看就明白了,好了,老师就把这个第四个方式呢,也给同学们全部说完了,我把它整理一下。没问题吧?还是比较简单对不对,其实说白了就是一个这个位置。是吧,这个位置第二个呢,就是我们所说的这两个是等价的,就是这个这个啊,这两个是等价的,诶我画成这个线线吧。
18:06
对不对,这这一段可以混用,这一段也是一样的,那原因刚才老师已经说过了,对吧,说呃,标准的使用方式是这个。但是使用方为了使用方便呢,也可以写成这个对不对。能看懂啊,能看懂,好,我把这个呢,也给同学们拿到这里来。好的,这是我们讲的第四一种复制,呃,创建我们结构体变量的方法,以及呃访问,诶这个地方为什么还没上去。再小一点好上去了啊,大家看能看懂啊,这写的很清楚,四种方法呢,同学们都要掌握。那有些同学说老师那我喜欢哪个呢?其实我我一般会使用这个东西啊,就看情况,我一般来讲会这样用用这个。我一般会用这个。对对不对,一般我喜欢就是在创建一个person的时候,直接赋值,直接给他就完事了。
19:03
它直接就是一个结构体。但这个时候它就是结构体变量,不是指针,好不好,我一般会使用第二种,第二种方式呢,也是在我们开发中用的比较多的,比较多的好,推荐大家使用第二种。那在讲完了过后呢,我们来看一下它的使用细节,我再走两句啊,我们说明一下前面三种四种方式的一个整理,第一个第三种方式和第四种方式返回的其实是结构体的指针。这点我就不再多说了吧。前面已经反复强调,其实返回的是个指针,没没问题,注意听第二个结构体指针访问字段的标准方式应该是星号结构地指针点字段名,比如新person.name com,这是标准的用法,比如说刚才老师在这提的这个就是结构体指针标准的用法应该是这样子的,对吧?这点大家一定要很清楚。第三点,氮。
20:00
构做了一个简化,它也支持结构体指针点儿字段名。你比如说刚才老师讲的这个。这个其实就是结构体的指针第二字段名。对吧,那为什么你可以这样用呢?按理说你是不能这样用的。因为你结构地只针,怎么只能这么去点一个,呃,字段名称是不允许的。对吧,但是这种写法呢,为什么他支持,原因是因为这种写法。Go语言的设计者认为更符合程序语言使用的习惯,那么go编译器在底层里面会对这个person点内做一个转换,其实他在真正编译的时候,他也会把这个东西给你重新加进去,但是这个转换的过程呢,被隐藏到编译器的底层了,我们程序员呢,不可见,也就是说。嗯,够够的,设计者他想的比较。比较周全,他认为这种写法呢,很多程序员觉得怪,所以说他也支持这种写法,但底层还是加上了,明白这意思吧,比如说别人面试的时候问你,诶,为什么结构体指针点那么可以用呢?你得告诉他。
21:10
其实是够的,设计者他为了方便支持这个,但底层仍然还是这种方式去用的,明白了吧?啊,所以说这两种方式都用,都可以用,都可以用,当然肯定一般人都会喜欢使用这种方式了。简单嘛,直接点一下就完了,何必还要去写个星号呢?但别人用这个,呃,取值这种方式在用,你要理解,这才是真正的用法,此时比较麻烦一点,大家都用了这种简化方式,能理解哈,好,我把这个细节说明给大家,整理到我们的笔记里面去,OK。好的。整理到位。整理到位。好,这是它的一个说明,说明里面有几点,我把它整整理一下,第一点。对吧。第二题。第三点。
22:00
好,全部说完对不对,第三种和第四种方式其实是结构体指针。那么这个地方要要知道哈,要知道就是构筑了一个简化,也支持他,也支持这种方式。这点要清楚对吧?它是可以这么用的,但原因实际上是这样子的,为什么可以用,是因为go编译器会对它做一个转换。好,这个大家要清楚,你别到时间说,诶你你说不出来123,别人就会觉得你没听懂吗。好,同学们,那关于我们。创建结构体的四种方式,以及它的字段的访问。我们就给大家介绍到这里,这块也是很重要的啊,这四种方式一定要搞清楚,不然的话,你后边别人写代码的时候,突然写了一个这个东西出来,你立马就蒙圈了,看不懂了。而且这种结构体在我们面向对象里面其实用的非常的多,好这这点请大家一定要高度重视,高度重视好,那我先把这一段,呃,这个这节视频先就先说到这里。
我来说两句