Go笔记-Chap10 反射

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可用来实现通用模板,适应不同数据类型。

你可能感兴趣的:(Go笔记-Chap10 反射)