Golang通过reflect包实现反射机制。
运行时会将接口变量的类型信息记录在一个rtype结构体中。
reflect包允许我们获取和操作这个rtype信息,从而实现反射。
具体原理为:
一、 reflect.TypeOf
reflect.TypeOf可以获取一个变量的类型信息:
t := reflect.TypeOf(i)
// *t 是 reflect.Type
二、reflect.ValueOf
reflect.ValueOf可以获取一个变量的值:
v := reflect.ValueOf(i)
// *v 是 reflect.Value
三、reflect.Type 和 reflect.Value
- reflect.Type 包含类型的所有信息
- reflect.Value 包含变量具体的值
他们可以互相转换:
v.Type() // 获取 Value 的 Type
t.Elem() // Value 的元素 Type
四、 获取结构体字段
可以使用reflect获取结构体字段:
t.Field(0).Name // 第一个字段名
t.Field(0).Type // 第一个字段类型
五、reflect 设置值
可以使用 Value 的 Set()方法修改变量的值:
v.Set(reflect.ValueOf(20)) // 改变变量的值
六、 调用方法
可以使用 Value.Method()获取方法,然后 Call()调用:
m := v.Method(0)
m.Call([])
总的来说,Go语言通过reflect包实现反射机制:
- 使用reflect.TypeOf获取变量类型
- 使用reflect.ValueOf获取变量的值
- Type和Value互相转换
- 获取结构体字段
- 使用SetValue修改值
- 使用Method和Call调用方法
这提供了在运行时查看和操作结构信息的能力。帮助Go语言也实现了面向对象特性。