10.1 类型
反射让我们能在运行期探知对象的类型信息和内存结构,从而弥补静态语言在动态行为上的不足。反射还是实现元编程的重要手段。
func TypeOf(i interface{}) Type
func ValueOf(i interface{}) Value
方法Elem返回指针、数组、切片、字典或通道的基类型
- 获取结构体指针的基类型后,遍历字段
- 对于匿名字段,用多级索引(按定义顺序)直接访问
10.2 值
Value专注于对象实例数据读写
接口遍历会复制对象,而且unaddressable,所以想修改,要用指针。
func main() {
a := 100
va, vp := reflect.ValueOf(a), reflect.ValueOf(&a).Elem()
fmt.Println(va.CanAddr(), va.CanSet())
fmt.Println(vp.CanAddr(), vp.CanSet())
}
输出
false false
true true
就算传入指针,也要通过Elem获取目标对象,因为被接口存储的指针本身不能寻址和进行设置操作
对非导出字段,不能直接进行设置操作
可通过Interface方法进行类型推断和转换
接口有两种nil状态,用IsNil判断值是否为nil
10.3 方法
动态调用方法,按In列表准备好所需参数。
10.4 构建
反射库提供了内置函数make和new的对应操作,MakeFunc可用来实现通用模板,适应不同数据类型。