请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

1回答

ccmouse 2018-06-23 20:05:40

刚定义,但是它是一个结构体。所以还是分配了内存赋了初值。接下来传递它的地址进去decode,decode函数于是填写这个结构的各个字段。这部分和反射没啥关系,如果我写一个函数叫做decodeNewBlockData(data *newBlockData),然后一个个字段填进去,一样能够达到这个效果。
反射体现在它是一个decode函数,参数是interface{},它怎么知道参数里面有Block,ReceiveAt等等这些字段呢?它不能直接说data.Block=...,因为这时它的参数是interface{}。这是go这种静态语言和python,js等的很大区别。所以它只能通过反射找到名字叫Block的字段,然后再给它赋值。
我建议同学使用调试器单步跟进去看一下具体的操作方法。需要一些耐心但是可以学的到。

0 回复 有任何疑惑可以回复我~
  • 提问者 chore #1
    decode应该是先用反射检测到结构的各个字段,然后才能填写了吧,否则结构里是什么东西都不知道,没法填写吧。老师我说的对不对。
    回复 有任何疑惑可以回复我~ 2018-06-28 10:09:53
  • 提问者 chore #2
    另外就是反射为什么不能滥用。
    回复 有任何疑惑可以回复我~ 2018-06-28 11:15:51
  • ccmouse 回复 提问者 chore #3
    这个是两边对起来的,我没有具体看过你这个例子里的decode,谁先谁后都有可能。反正是传入的字段和结构体里定义的字段对上了,就赋值。
    反射不能滥用呢?举个例子因为反射通常要靠字符串形式的名字去找结构里面的字段,就没有强类型带给你的好处了。我们通过结构体啊方法啊都是把概念抽象出来,反射的话至少会从思想上打破这些封装。
    所以我们工作中要用到反射的话,首先应该想如何不去使用反射,或者我们看有什么第三方库帮我们做了反射需要打成的结果。
    回复 有任何疑惑可以回复我~ 2018-06-28 20:45:59
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信