在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。
引用
基本方法
reflect包里定义了一个接口和一个结构体,即 reflect.Type 和 reflect.Value,它们提供很多函数来获取存储在接口里的类型信息。
reflect.Type 主要提供关于类型相关的信息,所以它和 _type 关联比较紧密;
reflect.Value 则结合 _type 和 data 两者,因此程序员可以获取甚至改变类型的值。
reflect 包中提供了两个基础的关于反射的函数来获取上述的接口和结构体:
// 提取一个接口中值的类型信息
func TypeOf(i interface{}) Type
// 返回interface{}里存储的实际变量
func ValueOf(i interface{}) Value
反射三大定律
Reflection goes from interface value to reflection object.
Reflection goes from reflection object to interface value.
To modify a reflection object, the value must be settable.
- 反射可以将“接口类型变量”转换为“反射类型对象”。
- 反射可以将“反射类型对象”转换为“接口类型变量”。
- 如果要修改“反射类型对象”,其值必须是“可写的”(settable)。
反射性能
通过reflect,我们可以实现获取对象类型、对象字段、对象方法的能力,获取struct的tag信息,动态创建对象,对象是否实现特定的接口,对象的转换、对象值的获取和设置、Select分支动态调用等功能, 看起来功能不错,但是大家也都知道一点: 使用reflect是有性能代价的!
有疑问加站长微信联系(非本文作者)