00:00
我们再来看一下结构体的第二,一个需要注意的。细节就是说结构体是用户单独定义的类型,和其他类型进行转换时呢,需要有完全相同的字段,这点请大家注意,就是说两个结构体之间如果需要转换的话,需要它们的字段要完全相同。什么叫完全相同呢?注意听这句话啊,叫完全相同,也就是说他的名字。它的名字,它的个数以及它的类型要完全一致,明白这意思吧,就说这三样都必须相同,如果这三样呢,有一个不相同,那整个它就它就不会转换成功,那么我们来看一个案例啊,我们来看一个案例,我们先把这句话呢拿到我们的笔记里边去,好吧。那同学们,我们走一个案例。我们走一个案例来打开这里,呃,还是讲细节嘛,还是讲细节,所以说呢,我在这里呢,呃。
01:00
因为这里面代码已经有点多了,干脆我们就这样子哈,我们再新建一个文件。新建一个文件夹吧,叫structure。底头。2DETAILS2OK,那这块呢,我们还新建一个文件main.go。对吧。好,为了省事呢,咱们就从前面这个地方找一部分代码拿过来用一下。好,我们放到这里来。主函数。好,我们来看一下,说现在呢,有一个type啊,我们叫A,它是一个结构体,这个结构体里面呢,有个number OK,没问题,Type b它也是一个结构体,它有一个类型叫int,完事。完事,那么这个时候呢,我们定义了两个变量啊,两个变量一个是A,它的类型呢,就是结构体AB,它的结构题变量是B,写完了,那么现在呢,我们问大家一个问题,如果我现在输出A和B。
02:09
能不能正确输出吗。肯定是能够正确输出的,也就是说这个时候呢,应该A这个变量和B这个变量呢,它默认值就是零,这个也是个零,对不对,所以说我们来运行一下CD点点我们CD到structure。Detail。二。好,我们go让一下同学们看到代码呢,就运行成功了,大家看到这是没有任何问题的,对吧,那现在呢,我要做这么一件事情,大家看。能不能成功,我要把B直接付给A。我把B直接付给A,大家认为这个可不可以,当我一保存的时候,你们发现它会报错。它提示一个错误,大家看到这里,他说cannot就是b type bs type a,也就是说你不能把一个叫做B的这个数据类型B这个结构体交给这个A不行。
03:07
那有些动物说老师能不能强转呢?我们来看看强转的话,我们应该把它转成什么,我们应该把它转A,这样强转,当我们一保存,我们发现。没问题了。强转是可以的,那我们来走一下。我们发现这样强转是成功的,没有报错,对吧?那么这个地方有个前提,你之所以能够把B。这个结构体变量转成A,这种结构体类型因为什么?因为你的字段是一样的。你的字段的个数名称类型都一样,你比如说如果我把这个A,我把我我这样说吧,我把这个B的这个数据类型变成FLOAT32或者六四,你们这样子。看一下能成功吗?你看这个时候他已经检测到不可以。
04:00
不能转。因为你的数据类型不一样,所以说数据类型不一样是不一样是不行的,我们再来看第二个名字不一样行不行,如果我把B的数据名称改成这个,你们发现它也不可以。那名字不一样也不行,看到没有还是不行,不但名字不一样不行,而且如果我们多一个数据类型也不行,假设我这还有一个类型叫NAME10寸,你们发现当我一保存,他又报错了。来看这里。看到没有,又不能转换,因此同学们注注意,如果你要在两个结构体类型之间进行转换的话呢,那么我们的要求是它们两个结构体必须要有相同的字段,所以要有相同的字段指的是字段的个数,字段的名称以及字段的类型要完全一致,能理解哈,这点请大家一定要重视好这块我们回答是可以转。我们这儿做一个结论。就是大家。
05:01
可以转换。可以转换,但是有一个要求,有要求什么要求呢?要求。就是。就是诶这写错了啊,就是结构,结构体的类型啊,结构体的字段,字段要什么呢?要完全一样。结构体,结构体的字段要完全一样。什么叫完全一样。就是包括。包括名字。他的名字要一样,包括它的个数要一样。对,你的个数要一样,还有。还有什么要一样呢?同学们,还有一个就是它的这个类型也要一样,你的类型不匹配他也不行啊,这点请大家注意一下。好,我把这个题的。这个整理把这个案例呢给给大家板书一把,好吧。
06:02
第二,板书一下,放这里有个印象好吧,好,这个题呢,我们就说到这。这里请大家注意啊,那么还有一点呢,我们看第三个细节,第三个细节是这样子的,结构体进行type谱重新定义了,比如说我有一个结构体。Ru。这个结构体可以再次被type重新定义,你比如说我这定义的定义的student,它是个结构体,然后呢,我type,我又定那个tu,他是student,诶乍看一眼。再看一眼,你会发现这个sto和student它其实是同一种结构体,对吧?但是大家看到,当我定了一个SQ1和SQ2的时候。我这样复制大家看到啊,SQ1SQ2,那么我把SQ1直接付给SQ2行不行。大家考虑一下。
07:01
大家想想可不可以我告诉大家这个结论啊,首先我告诉大家,这样转是不可以的。这样转不可以,就说你直接把SQ1交给SSQ2,这是不允许的。为什么这么说呢?因为高浪认为是新的数据类型。就是勾浪认为,当你用一个type重新定义了这个结构体,你自己定义的这个结构体之后呢,他认为sto,他认为这个类型。就STU这个类型和student这个类型,它是什么呀,它是两个不相同的数据类型,明白。他是认为这是两个不相同的数据的,因此你直接把这个SQ1交给SQ2,这个语法是要报错的,怎么办呢?你要怎么做呢?如果你这个正确吗?这我想答案是错误的。错误原因就是go认为是新的数据类型,如果你一定要这么做的话呢,你可以这么去处理。好,我把这写到这啊,如果你一定要这样做的话,可以这样做。
08:04
可以这样修改。怎样修改呢?就是sto。SQ2,等于好,我往这边往这边挪动一下啊。往这边挪动一下各位。HK,那么怎么做呢,强转。对不对,因为你SQ2是什么类型,是这个类型,因此呢,我把它强转成这个类型,就是ST找SQE这个就OK了。这个是OK的。明白啊明白,这就是其实这点呢,跟我们前面讲的是一样的,因为它相当于说两个结构体,他们拥有相同的怎么样字段就OK了,那么我们再来看这个题,同学们这有一个int,这个int它本身呢,各位同学,Int是不是一个,我们事先。这个go浪设计者事前就给我们已经定好的一个数据类型叫int,那么如果你用type,也可以给这个int取个别名,比如说叫int。
09:08
这是允许的,那么你这个时候这个ineg呢,其实也是一个in特了。那这个时候如果你给一个十,你把这个十交给一个I,你把这个I变量in in特尔给了也是可以的,那这时候你把20交给了一个int。那么同样我问大家一个问题,如果直接把I付给这个节可不可以?其实这地方也是不可以的,也不可以,为什么不可以?原因跟刚才一样,因为当你重新type了一下这个int过后呢,他认为这个数据类型就in特尔这个数据类型和int尔这个数据类型是两个不同的数据类型。因此你不可以把这个I直接付给企。当然我问大家一个问题,如果你就想把这个I付给这个解,可以怎么做,其实如果你一定要这么过做的话呢,你可以这样把它强制转换一下,就I等于这样写,因为你的这个节呢,已经是int了,所以说你这样写int。
10:06
把这个I强转,也就是说我把这个I这个数据类型。I这个I这个变量强制转换成int。那么我就不给他。能理解好,这样呢就可以了,好修改成这个即可。修改成啊这个就可以了,好,这是关于我们第三点的一个说明,这个地方是很容易让我们呃犯糊涂的啊,因为很多人他会认为,诶你这是student,我STU重新定一下,按理说他是同一个数据类型呢。对吧,一般的语言都会这么去处理的,但是go浪呢,他对他对数据类型的这个要求是非常严谨的,他就认为这是两个不同的,甚至你把这个int直接type了一下,他认为ineg和int也是不同的数据类型。OK,这点请大家一定要注意啊,不然的话,以后你在写项目的时候,包括我们后面写项目的时候啊,你就看不懂你的代码了,好,关于这块呢,我们把这个题给它粘过来。
11:05
就是刚才我整理的这一部分没问题吧。OK。那这块呢,我们对他进行了一个呃,修改和说明,就这。大家注意一下,看老师是怎么改的,包括这个地方,好吧,修改成这个就OK了。这个是OK的。这个是错的。好吧,我把这里呢给大家板述一下,放这。好,同学们,这个就是我们讲的这个结构体细节的第二块,大家把它消化一下。
我来说两句