reflect大概
类型与方法
通过go doc reflect包可以发现其中我们最常用的一个type Type interface
和一个type Value struct
通过以下两个方法可以获取到他们
可以看出在使用上面两个方法的时候是有将参数做空接口处理转换的。
reflect.Type
是指的变量的类型。其中reflect.Type
规定了很多的方法。reflect.Value
是指的变量值的相关信息.并提供了方法供我们使用查询。
具体使用
reflect.Type
首先是reflect.Type
。最简单的自然是获取目标的类型。上面的TypeOf
就可以直接返回目标的类型。但是其返回的是最浅层的类型。相当与var type x
他返回的就是type。申明的什么返回什么。
这时候:reflect.TypeOf
返回的就是sepString.当然前缀是你定义type的包名。
如果想要获取其底层的数据类型则需要使用Kind()方法reflect.TypeOf(s).Kind()
返回的就是string.
对于struct
其返回的自然是定义的结构提名称
reflect.Value
通过reflect.ValueOf
返回该值。其表示了目标的值。在reflect
包中为其提供了众多的方法供我们使用。部分方法如下说明。
Type()返回reflect.Value的Type。同样返回的是申明类型。参考reflect.TypeOf
Kind()返回底层的类型
interface()返回还原值
Elem()返回interface或者pointer的值。
其中Elem()涉及到通过反射修改目标值。首先修改目标值必须是修改其本身,就和interface
的实现一样。判断是否实现接口时对于reciever是否是指针类型是十分严格的。
|
|
就像上面代码写的一样,主要是通过指针获取。还有就是通过reflect.Value.Elem()方法获取reflect.Value的值。最上面的Elem注释是通过go doc 查询所得
对于 struct
|
|
这里基本就在上面的代码写的差不多了。还有就是最后Method.Call为什么显示的是[test and 1]
的问题。这也是为什么说修改时是使用指针寻址来的原因。上面value=reflect.ValueOf(v)
其实是产生的一个副本给value。所以修改了v的本身并不会影响value。
差不多简单了解了这么多。因时间以及能力原因我只是简单测试所得。其中估计会有不恰当或者错误的地方。在之后的学习中如果有发现会后续补充。如果有看到的同学还是要多实践以及阅读源码。