00:00
那么我们刚才呢,讲到了反射的这个第一个就是这个细节,然后呢,在这里我们引出了它的这个constant的一个内容,好,我们接着看反射的第二个地方需要注意的,那有些呢,不用举例,我直接念一下就可以了,啊是一个类型,T呢是类别,Type和K呢可能相同也可能不同,这个什么意思呢?郭同学。注意听啊,它可能是相同的,可能呢也不同。那这个取决于你传进去,进去的这个变量,就你传到这个地方做反射,这个变量它是什么类型的,如果你是一个基本数据类型,比如说像string啊,Float呀,波类型啊,Int类型啊,OK,那这个时候type和KD其实是相同的,因为它它不存在这个包的问题。那如果说你是一个student啊,像结构体呢,就不一样了,如果是结构体的话呢,它的type谱就是包名点student,而K就是怎么理解这个意思呢。
01:04
那就意味着我们这个student这个结构体可能是别的包也也允许有,也就是说在go里面它去区分一个type是包名加这个结构体的名称,那比如说我在我在这个包包下面有一个student,比如说我有个拍PKG。PK。Package这个一这个包有个10STUDENT的,它算是一个一个type,那也有可能我在PKG2这个包下面也有一个16的,这个是这个是不冲突的。因为我们知道在功能里面,它是区以包名来进行这个这个这个范围范围的一个区分的,那你看那相当于说,诶你你是10STUDENT,我也是10STUDENT的,但是呢,我们的类型不是同一个,但是呢,我们的类别都一样,都是什么样结构体,这点请大家注意一下啊好,这点我就举举例子了,大家应该很清晰的知道,好,这是我们的第二个案例,好,我们把它板述一下。
02:08
好,回到这边来,回到这边来啊,同学们,那刚才我们讲了反射的啊,这个注意事项两点反述一下。反射的注意事项和细节。来,同学们给他板书一小吧。那刚才呢,我们已然讲了两点。第一点呢,就是关于这个类别,它返回的这个常量,老师呢做了一个说明,哎,我做了一个说明,它是个常量,这个常量长什么样子,我们把它拿过来看一下。啊,这是一个,第二个呢,我们讲了一下,就是这个K,就是我们所说这K就cap啊type和这个CA的一个几个区别啊区别那么讲两点常量,我们来看看是指的哪里,第一个呢,就是刚才老师说的,你去找一下。
03:01
找一下它的这个文档里面,他写的很清楚,它是按这个写法写的啊CAD和type呢,它可能相同,可能不同,主要体现在哪里呢?主要体现在这个位置。啊,就是这个地方,就大家要区分的是这。哎,要问哪里呢?就是它可能相同啊,可能相同也可能不同,就要根据你的这个变量的类型来进行这样一个区分,好我把它反述一下,比如说这个就是这样一个情况。好,这是type和K的一个区别,紧接着我们看第三一个细节,各位同学来第三个细节,那第三个细节呢,前面我们已经讲过了,所以说在这过一下就行,第三个细节我们讲的是这个东西。说通过反射可以让变量在interface和之间进行切换,刚才讲的就是这样子的。我们刚才讲的一讲的这个案例,不管是基于基本数据类型的,还是基于这个结构体的,其实我一直在讲这个东西,他们可以随意切换,就说变量可以。
04:06
交给interface,那interface呢,可以转成它,它又可以转回去,它也可以转回去,所以你看这个箭头这样子的啊,这个我就不再多说了,还有一个大家看到你使用反射的方式来获取变量的值。并返回对应的类型。要求数据类型匹配。比如X。是int,我们应该怎么反射呢?是先拿到它的这个。Reflect value,再去取它的值,而不能用别的,那在我们前面其实已经讲过这个,大家看乙案例,你比如说刚才老师在讲这个,这个反思的时候,我们来看一眼啊,不着急看到这里,当时我怎么做的,你看这里我专门就强调了这一点。专门就强调这一点,就是说我我想去获取到,哎,不是这个啊,是这是这个我要取取它具体的一个值,我是这样去取的。
05:03
那这句这个细节重点强调是什么呢?重点强调的是你你想通过反射来获取变量对应的值,要这么去做。要怎么去做,那反过来同学们说,老师假设是一个结构体,怎么去选呢?假设我要把它取出一个结构体,怎么去取呢?有结构体的话,同学们啊,我们发现这个value应该没有这个直接的结构体,那你只能用断言了。我们看有没有这种。就找一下它的value。因为结构体,它这个结构体啊,它对应的type类型是无法确定的,你看这里面就没有这种东西。啊,你看这边就没有没有,所以说这个时候对结构体你你先得断言,然后再取才可以啊,所以大家注意这个细节就行了。啊,比如说我们强调的,呃,就是刚才讲的这一点啊,如果说你比如说你明明传的是听我说啊,你明明给这个接口传的是一个类型,但是你偏偏用flow去取,那这个地方就会直接给你报错。
06:06
啊,是编译错误还是运行错误,我看一下。比如说我我很清楚的知道这个reflect test01这个传,这个B呢,是100传进来的啊,我应该要这样取,但是我偏偏要这么去取。大家看我这样的下场是什么?第二,我用float去取好,我看编译它有没有检测出来。好,大家看这里,他说没有用好没有用,这个倒不是大问题,我用一下。N3,看编译这个层面能不能检测出来。大家看一下。我们发现在编译这个层面。找不到。为什么呢?因为对他来说,他现在已经变成一个这样的类型,你用int来取,Flow来取,都是属于运行时态了,所以它在运行的时候,他发现,诶,你怎么把一个把一个这个持有这个反射,它RVL,它其实持有一个int类型的一个反射值,但是你要把它转成一个float,那么错误就会在第20行发生,看一下是不是这样子的。
07:13
啊,这个细节大家注意一下啊。好点,点CD到我们刚才写的这个案例第二,Reflect DEMO go run main点够好,跑一下第20行应该报错。第二项应该报错,诶没有报错呢。转成功了吗?难道。哦,我知道为什么,是不是。啊,是不是我们没有调这个函函函数啊,好像是我我把它注销了是吧?啊所以说他没报错,是因为我这没有没有用它好把它打开,打开我们再用一下,好第二场应该报错。因为它在运行的时候发现有问题,大家看这里报了一个非常经典的时候,大家看啊,他说一个panle,他说call of有float。
08:02
On,一个int value啊,非常清晰了,他说你掉了一个float,但是你是给谁用的,Float是个T这样一个value啊,所以它就报错了,好这点呢,就是我们要强调一点,就说你将来想用这个反射啊,想通过这个reflect value。就是通过这个reflect value这个类型去取回对应的这个基本数据类型值的话呢,一定要确认是同一个类型,同一个类型,那当然有同学说老师老师我怎么来比对他是什么类型呢?可以这样做,就是你可以加判断。你也可以加这个判断,它到底是什么类型,你可以加一个判断啊,这个呢,这个这个大家注意这个细节就行了啊,注意这个细节就行了,好,那后面我们还会继续说这个事情的啊,所以这种不能乱用。这样不能乱用。好,这个细节呢,我也给同学们补充到笔记里边去,刚才讲的第四一个和第三个和第四个细节,好的,我把它直接满足吧。
09:02
职业板书。好,我们这边讲的有这么两点哈,第一个就是相互转换是OK的。我们其实讲的时候一直围绕这个在讲,然后呢,这个地方有个细节,就是要求数据匹配,就是你在取回的时候数据类型要匹配,比如你X传进int,那么你就应该用它,而不能用其他的,否则包panic。好,这个大家注意一下。我把它反射到笔里面去。这是我们版设的第三一个和第四一个。第三个和第四一个,好好,这一共有讲了四个啊好,我们截取一段是我看还有细节没有。好,这是我们讲的第五个好,这个呢,我们再稍事休息再讲,截取一段视频。
我来说两句