Golang中反射reflect的使用
Golang中的反射的使用
反射的含义
反射能够在程序运行过程中探知对象的类型以及对象的值,还可以获取内存结构。弥补了静态语言在动态行为的不足。反射实现了元编程的重要手段。
简单的说反射机制就是在运行时动态的调用对象的方法和属性,golang中使用reflect包可以实现反射。
反射的基础
变量
变量包括变量的类型和变量的值
(type, value)
其中类型包括静态类型、内置类型。静态类型就是常见的几种类型 int bool float 等。内置类型就是runtime系统所能识别的类型。
接口变量
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()
未完待续