基本介绍
- 反射可以在运行时动态获取变量的各种信息,比如变量的类型,类别
- 如果是结构体变量,还可以获取到结构体本身的信息
- 通过反射,可以修改变量的值,可以调用关联的方法
- 使用反射,需要import("reflect")
示意图
反射中常见函数和概念
reflect.TypeOf(变量名)
获取变量的类型,返回reflect.Type类型
reflect.ValueOf(变量名)
获取变量的值,返回reflect.Value类型reflect.Value是一个结构体类型,通过reflect.Value,可以获取到关于该变量的很多信息
变量.interface{}和reflect.Value是可以相互转换的
基本使用
反射注意事项
- reflect.ValueKind,获取的变量的类别,返回的是一个常量
- Type是类型,Kind是类别,Type和Kind可能是相同的,也可能是不同的,例如结构体
- 通过反射可以在让变量在interface{}和reflect.Value之间相互转换
- 通过反射的方式获取变量的值(并返回对应的类型),要求数据类型匹配,比如x是int,那么就应该使用reflect.Value(x).Int(),而不能使用其他的,否则报panic
- 通过反射来修改变量,注意当使用Setxxx方法来设置需要通过对应的指针类型来完成,这样才能改变传入变量的值,同时需要使用到reflect.Value.Elem()方法
反射的最佳实践
使用反射来遍历结构体的字段,调用结构体的方法,并获取结构体标签的值