反射的例子

来源:18-1 分布式系统简介

chore

2018-06-23

http://img.mukewang.com/szimg/5b2d9f9e000112a013140608.jpg

这个是源码,request 刚被定义,怎么就被decode调用了呢?

写回答

1回答

ccmouse

2018-06-23

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

0
3
ccmouse
回复
chore
这个是两边对起来的,我没有具体看过你这个例子里的decode,谁先谁后都有可能。反正是传入的字段和结构体里定义的字段对上了,就赋值。 反射不能滥用呢?举个例子因为反射通常要靠字符串形式的名字去找结构里面的字段,就没有强类型带给你的好处了。我们通过结构体啊方法啊都是把概念抽象出来,反射的话至少会从思想上打破这些封装。 所以我们工作中要用到反射的话,首先应该想如何不去使用反射,或者我们看有什么第三方库帮我们做了反射需要打成的结果。
2018-06-28
共3条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程