00:00
我们来看一下,在创建结构体变量的时候,我们也可以直接指定字段的这个值,嗯,前面呢,我们其实已经用过,呃,一些这样的方法,只是没有系统的再把它整理一下,我们来看看啊,做go浪在创建结构体实例的时候。可以直接指定字段的值。指定字段组方式一第一种方式呢,就是说如果我们创建的就是一个结构体变量,那么我们有两种方式,第一种方式呢,我们就是student,按照字段的注意听,按照这个字段的顺序给它复制。对不对,你比如说STUDENT1,我就可以写一个student那一段大括号,然后呢,这是它的第一个字段的值,这是它的第二个字段的值。这是一种方式,第二种呢,我们仍然可以用类型推导。我前面不用写VR这些乱七八糟的东西,我直接写个student的,按照字段复制,然后交给STUDENT2,这是一种方式。另外呢,还有一种更简洁的方式或者更明确的方式吧,就是说我们再去创建一个结构体变量的时候呢,我们也可以前面指定这一个字段的名字,然后呢值字段的名字和值,注意最后都有个逗号。
01:18
都有个逗号,然后呢,也可以用类型推导,直接把这负完值的一个结构体变量交给一个指定的变量值,好,那么这块呢,前面这两个用法其实大家是不是都已经接触过了。对吧,前面我其实都已经用过了,只是没有单独的把它拎出来说,因为有些时候呢,如果不给大家明确的说出来,大家总是觉得好像。模模糊糊的,因此老师呢,就在这明确的把它点出来了,来,我们把这块呢,给大家整理到我们的笔记里边去。好创建结构体的时候呢,对不对。创建结构体变量时指定字段的值。
02:01
那这块呢,我们说到第一种就是把它说明什么叫做指定值啊。好,我们把这个word笔记打开。好。这块。好像有点卡是吧,对。好,稍等一下。嗯。怎么动不了了呢?卡了。好,我们把这个放放在这啊,说明这块把它说好。呃,然后呢,我们说方式一对吧,方式一把它整理一下,前面呢,我们已然把这个方式一说过了,我在这里整理一下,好整理一下来,我们把这单独的写一个文档。写一个案例,这个案例呢,就是专门来讲一下,就是结构体的这个赋值的问题,对吧,S as as。
03:08
Gn assigned。好,那么这里面呢,我们新建一个文件叫main.go。OK。好,然后我把前面的这一段共用代码放过来。好,拿到这我们来举个例子,Function,那么function里面呢,有一个主函数。好,我写一个结构体type。那么就叫student student这个结构体好吧,然后。啊,这里面呢,我们定义两个字段,一个叫名字,一个叫它的年龄,好写完了,那这个时候呢,我们来创建的时候,方式一创建啊在在我们说在创建这个结构体变量时,就直接就直接。
04:00
直接指定指定字段的值。没问题吧,好,那么就是STUDENT1走。第一种方式就是这样写STUDENT1。对不对,然后呢,我们等于啊,等于一个什么呢,就是16人。然后给他赋值,赋值的方式按照顺序给就行了,比如说第一个是名字,我们就叫什么呢?我们就叫小名。年龄18,注意这个顺序很重要啊,因为你是这样写的话,那就一定要保证你的第一个值要对应第一个字段,第二个值要对应第二个字段,这是没有什么可商量的。不然的话你就错位了,好,这是一种方式,还有一种方式呢,就是你用类型推导,这样也行。这样子直接这样写,就是前面不用VR,这样也可以。好,这是比如说小明。不让20这样也可以,还有一种方式呢,就是如果说有些同学说老师担心我,比如说有些同学担心我,这个值呢,跟这个字段顺序有时候会匹配不上,因为有些时候你写完了过后,你有可能不小心又把这个字段改了一下顺序,那这样写就会很危险,明白吧。
05:18
因为这样写你会把小明付给这个年龄,那肯定代码会出错的,那怎么办呢?还有一种方式就是更加的灵活,或者说更加。健壮一点。写法还有一种方式。这个还有一种方式,就是就是我们说的还有啊,就是方式,这是方式一。整理一下。这些都要会哦。你到时间这没有搞明白,后面就会比较麻烦了,呃,那么还有一种方式就是通过什么呢?在创建。结构体变量时对吧。把这个字段名。把字段名和字段值写在一起。这段子写在一起。
06:02
啊,这个呢也可以。写在。写在一起。好,那你看一下,我这样再给大家举两个案例好吧。这个时候呢,我们可以这样写了,Student,比如说是三,那这个时候呢,我们这样写,比如说。我这样写啊,同学们看到先这样子括号。括号过后呢这样写,比如说name。我就直接告诉他我们这个name值是多少,比如说是Jack。然后呢,H是多少,比如说是20,注意这个地方呢,也会有个逗号。最后这个也会有逗号哦。那这样子有什么好处?这样子的话,即使你这个student的字段在定义的时候顺序发生变化,我这个代码也是正确的,为什么?因为我明确指定的H是等于20的,这就不依赖于顺序了啊这种写法。
07:04
这种写法。就不依赖于,就不。不依赖。不。依赖什么呢?他就不依赖诶。依赖它就不依赖这个字段的顺序了,字段的定义顺序啊,所以说这种写法它会更稳健一点啊,更稳健点,即使你这个顺序,这进行的顺序发生变化,也不影响我好吧,那当然这帮仍然也可以使用我们的类型推导。也可以使用类型推导,你看这次呢,我故意把这个顺序,呃呃这个颠倒一下,大家看到啊,我先写H。好,给他一个30,然后呢,再给一个名字,注意这个地方逗号,不要忘了再给一个名字叫Mary。没问题啊,这样写也可以,因为别人知道这个age是30,名字是Mary就可以,好,这个时候我们来输出这四种啊,我们看看有没有问题。那我把这个16乘一数出来。
08:02
16等于1SQ1好SQ2对吧,ST3。SQ4,那这个时候呢,就会把三个结构体变量的,呃,结构体的实例的值输出来,那么看看有没有问题,那我CD上一题好看代码有问题了,我们看哪里有写错。这是不是少了一个逗号啊,诶,少了一个逗号。好的,我先CD到。Structure as sand好,我们看这边好像有毛病,我们看哪里有问题。哦,他说这个地方,但是没有打红线哈,这。这有个问题,看哪里?他说16乘四。申明。看这里说啊,没有使用,他说我16乘四没有使用,哦,对了,那这块没有使用,对不对,把它改成四就可以了,来跑起来go run什么呢?命点go跑起来,我们看结果。
09:00
我们可以看到,这时呢,这几个词都是正确的,小明小明20JACKIE Mary,没问题吧,好,正确的。注意看这个地方,我顺序颠倒了也不受影响,但是你这不行啊,如果你是使用这种写法啊,各位同学,如果你把这个20和小明颠倒了,那你看看这个后果,那就比较麻烦了。好,我们看看这时,比如说。小明波浪,那你你这个相当于把二给谁了,把这个名给了名字,把小明给了age,那你想这个时候肯定是要报,报错的,那我们跑一下。看其实你还没有走,他已经检测出来了,对吧,他说什么呀,他说这个type int和string它是不匹配的,对不对,他已经给你检测出来了,看到没有好。所以说呢,这一点大家注意一下。这是我们的方式一,那还有方式二,我们要顺带把把它讲一下方式二。方式二是什么意思呢?大家看我的幻灯片,就是有些时候呢,我们是希望直接把直接返回一个,就是结构体的指针类型,这个用的也非常的多,后面我们讲工厂模式的时候就会用到这个知识点,有些时候呢,我们是希望把这个结构体的指针返回给一个变量,那怎么做呢?
10:19
前面加个艾特符就行了,同学们注意啊,这两种方式是完全不一样的,这种方式是直接把这个结构体返回给一个变量,这种方式是把一个结构体的指针返回给一个变量,那么这时STUDENT5和10STUDENT6其实它是指针类型。这跟前面这个是不太一样的,注意吧,啊,但是用法还是一样,因为我们知道,呃,勾浪的设计者呢,他把这个结构体和结构体指针的使用怎么样合并在一起了。对不对,它底层做了一个优化,那不管怎么样,我们来看一看方式二这个地方是怎么做的,方式二就是返回。返回什么呢,结。
11:01
结构体的指针类型。好,这点呢,我们要把它拿下啊,因为后边这点用的还很多,就这个知识点还是很重要的。那我来看看这个案例,比比,比如说我现在16帧的二,我要把它返回一个指针类型,大家看这里写。艾特sto。ST。好呃,我为了省事啊,我为了省事把这个地方粘贴拷贝一份。好,这个时候我们改个名字叫做小韩小王八。小王。好,年龄29岁,这个时候大家注意观察,这个sto就是指针类型的,而不是结构体这种类型啊,大家注意听啊,因为你这是艾特福吗?如果在内存里面,你们可以想象到,其实这个SQ2它是这样子的。ST2,它是先指向了一个地址。这个地址又指向了我们这个结构体的空间。
12:00
结构体空间。数据空间啊,那这个数据空间长什么样子,就是你的数据本身啊,这两个数据它是这样的一个结构,明白吧,所以大家跟上面不一样哦,上面如果你这样写的16吨的一,它是这样一个结构,在内存里面是16帧的一。就直接指向了什么,结构体的这个空间直接指向了。啊,结构体。结构体数据空间。它中间没有这个地地址,这这一说了,明白明白这意思吧,但是用法是一样的,为什么这么说呢?因为大家都student和这个student指针呢,它编译器在处理的时候,它为了方便,其实把它整合在一起了,但是大家要注意区分,好吧,本质是不一样的,好,这是写法,还有呢,诶这个地方我就要写成16帧的五了。对吧,改成16.5,因为我现在已经有几个变量了嘛,还有16.6也可以用类型推导。你也可以这样写。说老师我这样写行不行,一样的也是可以的。
13:02
就说前面我不用VR对不对,小王写个波浪号,然后39岁一样的,还有这种,除了这种写法呢,他也可以使用这种,就是怎么样呢?在创建结构体变量指针的时候,把字段名和字段值写在一起,这种写法也不会依赖于啊,那我把这句话粘过来,注意听,在创建结构体指针。指针变量时。变量时把字段名和字段写在一起,这种写法也不依赖于字段顺序。好,我给大家演示一下,比如说我这里有个VR。STO6。等于at。ST好,同样包起来,当然这帮我写名字注意听啊,这块都很重要,不然的话你以后看别人代码,说实话你是很难看懂的,这是小小李。对吧,小李好age,那age呢,比如说他49岁写完。对吧,这个地方也是一个地址,好,那这是一个地址的话呢,我们在访问的时,呃,我们还有类型推导也可以STUDENT7。
14:07
五六啊。啊,123456,这个应该是七。那这个就应该是八了,也可以用类型推导来完成。怎么写呢?一样的道理粘过来。好吧,那这个时候我们叫做小李一个波浪对吧,59也可以,顺序也可以颠倒。为什么可以颠倒呢?因为它已经不依赖于它顺序了,别忘了这地方还有什么逗号。是不是前面讲过这个逗号好,写完过后,这个时候我们也把它输出一下啊,点print,那这个时候因为你的10STUDENT5这些啊,它本身。这样子输出它会带一个什么符号,你们注意观察,因为它是它是指针吗?所以说你这样直接输出的时候呢,他在前面会带一个特符,告诉你它是指针取出来的,大家看是不是这样子的值和上面一样,该怎么样就怎么样,只是前面它会有一个艾特符,诶这么出了问题了,看在哪里。
15:10
不好,结果写错了,大家看效果。抛弃了。我们与我们也许看到这边有问题啊,再看这里。Too many。好,我们看这地方问题是在什么地方看一下。太多的参数去转换student。好,我们看哪里有问题呢。我们看哪里有问题。OK,地址服务对吧。STU。Sto,好,我们来检查一下。大家看到我这里问题啊,我这边的问题大家有没有发现,其实就是这一点小问题,我们把这个大括号写成了小括号,对不对,这样子是有问题的啊。好,这样把它改过来就可以了,保存一下看代码,现在是不是就没有错了呀。
16:01
没有错,我们来运行一下,跑一个跑。我们可以看到,当它输出的时候呢,它会多一个这样的东西,他其他都一样。看到没有?艾特符,这表明它是个地址,那么怎么样把这个地址去掉呢?非常简单,你就用一个取,取取值的一个符号,对不对,这样呢,它在输出的时候,那个地址符它就会拿掉,这个大家可以理解吗?因为它你本身是指针,那么我前面给他来一个取值运算符,这样子就把这个结构体本身的这个数据空间拿到了,就好像这个地方你直接取的是取到地址再再拿到套,那么我这个有个取值符号,这个SK1取就直接取到这里面内容了,明白这意思吧,好,我们跑一个。跑起来,这个时候你看到艾特符号就没有了。对吧,你们可以看是不是跟刚才一模一样啊,对吧,好同学们,那关于我们这一个结,在创建结构体的时候呢,我们有这么几种方式啊,两种方式,每种方式里面有四种写法,大家要注意,尤其是注意这种。
17:05
第二种方式,二种写法,因为后边我们在学工程模式的时候就会用到这个知识点,注意它返回的啊是一个指针。它返回的是一个指针。啊,那么有些人也喜欢这样写,说老师,呃,前面我我前面要在后面写个类型是什么呢?那就这样写的。这样写也可以,就说我告诉你STO5它的类型就是指向一个student的结构体的指针,这样写也可以啊,你不写也可以,因为不写的话,它会自动判断这个STO5就是这么一个指针,对吧,你这样写可以,那你看我再运行一下也是没错的。看到没有,这样写也是没错的啊,好,我把这个呢给大家板书一下,这几种写法一定要会啊,同学们,我再说一遍,方式一和方式二。整理一下笔记。那方式一呢,呃,我们首先是先。对不对,这有课这个地方定义,定义了一个结构体。
18:03
对吧,这个地方定义这个结构体。我们把它拆解一下,这样大家看的更清楚一点,这是一段定义结构体的代码,那么我们怎么去用的呢?方式一是怎么用的呢?好,方式一的创建方式其实就是这里。好,这一段代码。对吧。OK,这个是在main函数里面啊,我写一下。这个是在main函数中。Me?在命。在幂幂函数中。好。这段代码是在main函数中,大家一看就应该也也能看清楚,也比较简单,然后呢,下边。下边呢,方式二方式二我们是怎么用的呢?它是返回的是结构体的指针,对不对,它是这么一段代码。方式二。
19:01
好,把这个方式二呢也给大家。整理一下这块呢,也是在命。函数里边对不对。这块也是在main函数里面。在。Me?函数。函数中。好,放到这里来,没问题吧,我把它整理一下。好,这这两种方式,四种写法,大家要把它掌握好啊,后边呢,我们再讲工程模式,马上就会用到的,好大家把这块消化一下。
我来说两句