00:00
那下边呢,我们看它的第啊五个需要注意的地方,反射,那么通过反射来修改变量是个细节。啊,这个是个很重要的细节,比如说现在我有个需求啊同学们,我们希望呢,通过什么呢?能看到屏幕吗?啊通过反射来修改变量,比如说当我想使用set什么什么方法来设置设置需设置设置的时候呢,需要通过对应的指针类型来完成。那我举个例子啊,同学们,比方说现在我有这么一个需求,什么需求呢?举一个案例,我传了一个int进去,比如说我传了一个int进去,那么我希望在反思这里面把这个int这个值给我改过来,诶就看这个需求怎么做,我们新建一个文件,各位同学新建一个文件夹,不在原先这么写了啊,所以都只提到一个地方比较麻烦,这black这个我们叫做details啊,这个这个细节呢,我们需要举个例子。
01:01
好,我们来举个例子来,我们新建一个文件夹,你看这是第五一个细节的一个案例。好,我新建一个文件,各位朋友main.go诶梦点go。那么现在我有一个需求是这样子的,我先把这一部分粘过来。啊粘过来,然后呢,我先说明我想干什么事,干什么呢,通过反射,哎,通过反射修改,修改什么呢?我想去修改这个,呃,Int类型的,比如说number int的一个number int的一个值。当然我这个做完了过后呢,我们再去修改一个student这个结构体的值。啊,这样呢,我们两步就一起来完成啊来,首先我写一个啊,当然这也是一个反射啊flag啊,我们叫modify吧。呃,就叫就叫这个flag就行了,也不去做特殊说明,好,现在呢,前面这一部分因为是一样的老师呢,就不啰嗦了,我就把前面那个代码拿过来用一下。
02:10
诶,前面这部分是一样的,我就我重点我是想想要这个东西啊,我要这个这个东西好,我们先把它翻过来。好,然后呢,这边肯定是有一个空接口的interface。好,Interface。Interface好是没变色哈,然后呢,写一个主函数。各位同学主函数,那主函数呢,我先写一个这样的东西啊,同学们看。我们先按照这个套路出牌,我们按这个套路出牌,我们先来写一个这样的东西,比如说我有一个number number,然后呢,我先给它定义啊,一个int,但是我我也可以直接写啊,我我我这样写就是显得更更明确一点,其实我可以直接一个冒号就完事,完事了,然后呢,我把传进去。
03:04
Reflect,零幺,我把这个number传进去,同学们想哈,你这样传进去显然不用多说,你这个地方的value of也好,其实最终呢,不会影响到这里,其实相当于是个自拷贝啊,相当于把这个相当于把这个B放给他,过后呢,这个你相当于是这个B。传给他过后,这个这边的改变,就这边的这边的改变不会影响到这个number啊,那你没有用,所以说呢,我们要怎么做呢,我们肯定是传了一个地址过去才能用。但是当我们传了一个地址过后,我们来看看一个问题啊,同学们看我们,我们非常明确的知道这个反射的这个reflect value,它本身是提供了一个方法的,什么方法呢?就是site。点,它其实确实提供了一个方法叫什么方法呢?叫做set string。我们看看是不是有这个方法,果然是有这个set尺寸看一下。
04:01
他说的是stringin,那好像是什么呢?好像是通过它就可以改变这个值一样,我们看对不对。S。十寸。二。哦哦,对对,Set in啊,这对写错了,Set in,它有set啊,我这传的是整数啊,我怎么想到别的地方去了set in,看有没有in呀,Set in也有。对吧,Set int也有,好,我们给他传一个字改变它,比如说我把它改变成20。好,那么这个时候呢,我们来输出这个值format点,好,我们看下这个number有没有变化呢。来我输这个number,但我一保存就报错了。但我一保存就报错了,好,我们看哪里哪里有错误啊,那这里面应该报错才对啊,他为什么没错呢。他应该报错才对啊。按理说应该报错啊,我执行一下看看我我执行一下他就会报错了,CDCD到我们这个叫做呃,刚才写的这个reflect details。
05:10
好,我们DRCD到D05GO run main.go跑一下。果然报错了啊,果然报错的原因大家可以看到,在这里他说啊,Reflect value set using,他说你使用了一个on addressable value,就说你使用了一个什么,没有一个可地址,就是跟地址相关的一个值。什么意思呢?就是说你在这个地方啊,你在这个地方去使用它这个不报错很奇怪,它运行的时候报错了,应该是运行它检测不出来,它检测不出来这个类型,因为你这传的是一个什么呀,看细节啊,你这传的是一个。穿的是一个地址进去,那么这个时候这个类型,注意这个类型。它本质是个什么东西呢?它的类型,如果说我们把它打出来这个类型啊,你会发现它其实是一个指针。
06:09
那么我们看看是不是这个时候类型是什么,我们看看啊,注意听,因为你这传的不是这个不是number,而是一个例子,所以说我们可以看一下,看看看看此时此刻r value它的这个类型就是那K吧,我叫K是什么,原先那个K是不是int类型啊。注意注意注意听啊,现在我们看到把它打出来看一下。他的这个现在它的CA是什么玩意儿,就是为了它的CAD,等于我们把它输出来看一下各位同学,他的CAD很简单,用它点一下,大家就可以看到它的这个类类类别类别我输一下,大家看它的类别你上发出来诶。这个地方是哪标错了?啊,大写的K,大写的K啊,不着急,我先把这个先注销。
07:02
我先把它注销,同学们请看效果,这个时候它打出一个K呢,呃,我们发现,呃这个地方是没有写全啊,不好意思。保修箱。好,我们把这输出来,你会发现它的这个呢是一个指针。就它的这个大的这个类别呢,已经不再是结构体了,它是个指针。你可以看到它是一个PTR,那如果说说老师,那你假设传的就是这个值呢,大家想一想这个看的是什么。这开是什么,是不是个T呀,那你是本质不一样了吗?你看你个返回是个int。是个内int吗?哦,原来明白了说哦,原来是这样子的,那这个时候你就必须传这个指针进去,你才能改变,因为你要传进去才会改变到它嘛。那么这个时候为什么你这样用这个它会报错呢。那就来看一下这个问题了,大家看,因为这个地方它的类型已经不再是这种指类型,而是一个指指针类型了,因此我们要看有没有一个方法获取到它的值,这个有点不好理解啊,同学们。
08:10
同学们有点不好理解啊,这地方呢,要这么做才行,因为同学们非常清楚的知道啊,在我们这去调这个赛的时候,它的绑定的方法。其实是这个方法。他是跟这个绑定的。跟这个Y这个这个绑定的,说白了他认为是什么呢?他认为就应该是那种非地址的,就非地址的才能用这个方法。可是你现在是个弟子,他就没法用这个东西了,刚才报了个意思,其实也能看出来,那现在就意味着我们必须把这种地址类型的重新转成。非地址的,那怎么办呢?好,同学们可以看到它这里提供一个非常重要的方法,很简单,但是很重要,后面全部都用到,后面这个大量度用到这个东西啊,叫element。Element,我们找到这边有个特别重要的方法叫element,叫他来看这里。
09:04
它虽然都叫Y6,但是类型不一样了,看a element反为V持有的接口保管的值,或者是V持有的指针子相对值,这句话很重要。返回V持有的指针指向的指,哦,原来是他呢。这个才是我们真正要去拿的,才能调这个方法,也就是说你只需要在这样做一个动作就可以了。这样就搞定。一切搞定,那么这句话到底是等价于什么?这句话你可以这样理解,你你可以这样理解我,我写个测试代码啊,你可以这样理解这句话。你。你。可以,可以这样理解,这句话就哪句话呢?就是同学们现在刚刚看到的这句话。就这句话怎么理解呢?你可以这样理解啊,啊说我们这有一个number,注意听说我们这有个number是一个int类型的。
10:04
是一个int类型的九,然后呢,你这里有个PTR指针是指向一个int的,然后你把这个东西给他了,然后呢,你要取的这个值呢,诶同学们看到当你要取得一个具体的值的时候,比如说你你要你要反回来再取到它这个值,你是怎么取的呢?比如NUMBER2是怎么取的呢?是这样取的心PTR,你可以简单理解成就好像说我这种这种写法,就相当于取到了这个指针,取指向这个真正的值,然后呢,我再调用的方法就可以改变它,当然它在底层呢,改变的时候其实是改变了同一个数据空间啊,所以说也可以简单理解这句话。这个有点类似于这种感觉。有点类似于啊。类似。就上面这个代码有了类似于这种东西,就相当于说它这个地方的作用是要返回RV r value,它的这个指针指向的那个具体的那个指,然后呢,再改变它。
11:06
啊,那具体的值就是它这个空间了,就它的空间好,这样一做呢,代码就OK了,同学们看老老师给大家演示一下,这个时候代码不会报错,而且这边会输出。20。这个这个是一个很重要的点啊,同学们,这个这句话特别重要,后面我们几个一个应用就是反射应用里面大量用到这个element。因为我们我们这个反射它必须要有一个一一个这样的能力,就是说我我们希望反射就能直接改变外面的这个结构体啊,或者这个变量的值,因为因为你本身价值不就在这吗。好,那么大家看到,当我这样一执行,你会看到效果就出来了。好,同学们可以看到。啊,同学们可以看到,此时此刻,你们可以看到这个效果,Number变成了20。Number变成了20,呃,那这点大家就应该清楚了,如果你没有这句话直接报错啊,直接报错,因为他认为你是用一个呃,这个这个指针的地址去进行这个处理,他他他他都不知道这个值是什么。
12:13
说上这个element很重要啊,好,我把这这个含义给大家,再给大家写,写到这边来。就这个element什么意思?OK。把这句话给它放到这,这句话特别有用哈,好,同学们,那么关于就是老师说的这个细节呢,我们就讲到这儿了,那同样道理了,同学们,如果我让你们去改变,如果我我我让你们去改变一个结构体的值,你们是不是应该也这样类似这样处理啊?打个比方,我要求你们在这在老师一个基础上去传一个学生,然后把学生的名字给我改了,你会改吗?啊,当然也一样的道理啊,当然也一样道理,但是呢,呃,结构体的改变比这个要稍微麻烦一点。因为你首先还要拿到它的一个字段,你才能改。
13:01
你字段都拿不到,你怎么改啊。说结构体肯定比这个普通数据类型还要麻烦一点,那后面我会讲这个案例啊,好,这个就是我们讲的这个第五个细节,第五个细节OK,第五个细节呢,我们先把它板书到我们笔记里面去,第五个细节。好,第五个细节呢,我们讲了这样一个案例啊,讲这个案例,那具体来说呢,呃,其实就是刚才说的这么一点东西啊,这些方法,最后这个案例是这个案例啊,啊这个案例跟我写的一样的,我从这粘过来也是一样。啊,这个案例做重点就是强调这。这边一定要拿到这个值啊。好,然后呢,呃,其他的就不说了,第六一个细节,第六个细节其实不是不算什么细节,就是呃告诉大家怎么去理解reflect value.element这这个这个含义,就这个函数怎么理解,怎么理解呢?我这画了一个图,其实就把我刚才再说了一遍看啊,比如说刚才我们这个把这个number用这个反射了一下,反射把这个地址传给了FN,那么这个FN其实就是呃就就相当于是那个接口拿到那个东西,然后呢,FN.element.set这个就改变这number,那怎么理解这这这个东西呢?就是这样理解FN.element就这句话。
14:22
就等价于刚才老师说的这个意思对吧,等价于这个,把这个星号取出来干什么干么什么事啊,就这意思啊,好同学们,那这个细节呢,我们就先说到这了。好好理解一下啊,好好理解一下。好,我把这个呢给同学们板书到笔记里面去,这是第六点。好,这是第六点,好的,我把它给同学们放到笔记里面来。好了,这是第六个细节,第二个细节说完了过后,同学们,我们现在来做几个题。好,那么我们先截取一段视频。
我来说两句