采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这个是源码,request 刚被定义,怎么就被decode调用了呢?
刚定义,但是它是一个结构体。所以还是分配了内存赋了初值。接下来传递它的地址进去decode,decode函数于是填写这个结构的各个字段。这部分和反射没啥关系,如果我写一个函数叫做decodeNewBlockData(data *newBlockData),然后一个个字段填进去,一样能够达到这个效果。反射体现在它是一个decode函数,参数是interface{},它怎么知道参数里面有Block,ReceiveAt等等这些字段呢?它不能直接说data.Block=...,因为这时它的参数是interface{}。这是go这种静态语言和python,js等的很大区别。所以它只能通过反射找到名字叫Block的字段,然后再给它赋值。我建议同学使用调试器单步跟进去看一下具体的操作方法。需要一些耐心但是可以学的到。
decode应该是先用反射检测到结构的各个字段,然后才能填写了吧,否则结构里是什么东西都不知道,没法填写吧。老师我说的对不对。
另外就是反射为什么不能滥用。
这个是两边对起来的,我没有具体看过你这个例子里的decode,谁先谁后都有可能。反正是传入的字段和结构体里定义的字段对上了,就赋值。 反射不能滥用呢?举个例子因为反射通常要靠字符串形式的名字去找结构里面的字段,就没有强类型带给你的好处了。我们通过结构体啊方法啊都是把概念抽象出来,反射的话至少会从思想上打破这些封装。 所以我们工作中要用到反射的话,首先应该想如何不去使用反射,或者我们看有什么第三方库帮我们做了反射需要打成的结果。
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
713 1
2.0k 1
1.1k 12