Golang中的反射的使用

  • 反射的含义

    ​ 反射能够在程序运行过程中探知对象的类型以及对象的值,还可以获取内存结构。弥补了静态语言在动态行为的不足。反射实现了元编程的重要手段。

    ​ 简单的说反射机制就是在运行时动态的调用对象的方法和属性,golang中使用reflect包可以实现反射。

  • 反射的基础

    1. 变量

      变量包括变量的类型和变量的值

      (type, value)

      其中类型包括静态类型、内置类型。静态类型就是常见的几种类型 int bool float 等。内置类型就是runtime系统所能识别的类型。

    2. 接口变量

      Golang的指定类型的变量的类型是静态的(也就是指定int、string这些的变量,它的type是static type),在创建变量的时候就已经确定,反射主要与Golang的interface类型相关(它的type是concrete type),只有interface类型才有反射一说。

      每一个接口变量都维护一个pair对,其pair对是:(type, value)

      value是实际变量值,type是实际变量的类型。一个interface{}类型的变量包含了2个指针,一个指针指向值的类型【对应concrete type】,另外一个指针指向实际的值【对应value】。

      pair对在接口变量的连续赋值过程中是不变的。

      interface及其pair的存在,是Golang中实现反射的前提。

    ​ 总而言之, 反射操作所需要的基本信息都是来自于接口变量。接口变量除了存储自身类型外,还会保存实际对象的类型数据。

  • 类型反射

    类型反射的入口函数:

    func TypeOf(i interface{}) Type

    该函数会将任何传入的对象转化为接口类型。

    未完待续

  • 值反射

    值反射的入口函数:

    func ValueOf(i interface{}) Type

    未完待续

  • 反射方法的调用

    通过reflect.Value 来获取,也需要配合 Elem()

    未完待续