欢迎访问我的博客,你的支持,是我最大的动力!

golang的反射reflect

Linux 小马奔腾 321℃ 评论
目录:
[显示]

反射的机制是在运行时动态调用对象的方法和属性

interface 和 反射

- 变量包括 (type,value) 两部分,所以 nil!=nil
- type包括 static type 和 concrete type (runtime系统看见的类型)
- 类型断言能否成功,取决于concrete type
只有interface类型,才有反射一说 一个interface{}类型的变量包含2个指针,一个指向值的类型,一个指向实际的值

reflect的基本功能 TypeOf 和 ValueOf

TypeOf获取数据的类型,若为空则返回nil
ValueOf获取数据的值,若接口为空则返回0
反射可以将 接口类型对象 转换为 反射类型对象(reflect.Type,reflect.Value)

从reflect.Value获取接口interface信息

已知原有类型(进行强制转换)

realValue:=value.Interface().(已知类型)
反射可以将 反射类型对象 转换为 接口类型对象
注意:强转时类型必须正确 否则会panic

未知原有类型(遍历探测Field)

通过reflect.Value设置实际变量的值

reflect.Value(X),只有当X是指针时,才可以修改实际变量X的值
Elem表示获取原始值对应的反射对象,所以原始值一定要传指针,否则会panic

通过reflect.ValueOf进行方法调用

先将方法注册,即MethodByName,然后通过Call调用
一定要指定参数为正确的方法名

MethodByName必须指定准确真实的方法名,否则会panic

reflect的性能

reflect的性能
反射会比较慢
涉及到内存分配及后续GC
reflect实现里有大量枚举(for循环)

参考文档https://juejin.im/post/5a75a4fb5188257a82110544#heading-13

 

转载请注明:轻风博客 » golang的反射reflect

喜欢 (0)or分享 (0)