reflect
10.reflect
01.反射
反射是指在程序运行期对程序本身进行访问和修改的能力
1.1 变量的内在机制
- 变量包含类型信息和值信息 var arr [10]int arr[0] = 10
- 类型信息:是静态的元信息,是预先定义好的
- 值信息:是程序运行过程中动态改变的
1.2 反射的使用
- 反射是指
在程序运行期对程序本身进行访问和修改的能力
。 - 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。
- 在运行程序时,程序无法获取自身的信息。
- 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中
- 并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。
- Go程序在运行期使用reflect包访问程序的反射信息。
02.反射方法
反射可以在运行时动态获取程序的各种详细信息
2.1 TypeOf
reflect.TypeOf()
获取类型信息
2.2 ValueOf
reflect.Value
获取值reflect.Value
类型提供的获取原始值的方法如下
方法 | 说明 |
---|---|
Interface() interface {} | 将值以 interface{} 类型返回,可以通过类型断言转换为指定类型 |
Int() int64 | 将值以 int 类型返回,所有有符号整型均可以此方式返回 |
Uint() uint64 | 将值以 uint 类型返回,所有无符号整型均可以此方式返回 |
Float() float64 | 将值以双精度(float64)类型返回,所有浮点数(float32、float64)均可以此方式返回 |
Bool() bool | 将值以 bool 类型返回 |
Bytes() []bytes | 将值以字节数组 []bytes 类型返回 |
String() string | 将值以字符串类型返回 |
2.3 修改值
- 想要在函数中通过反射修改变量的值,需要注意函数参数传递的是值拷贝,必须传递变量地址才能修改变量值。
- 而反射中使用专有的
Elem()
方法来获取指针对应的值。
2.4 isNil()和isValid()
isNil()
IsNil()
报告v持有的值是否为nil。- v持有的值的分类必须是通道、函数、接口、映射、指针、切片之一;
- 否则IsNil函数会导致panic。
isValid()
IsValid()
返回v是否持有一个值。- 如果v是Value零值会返回假,此时v除了IsValid、String、Kind之外的方法都会导致panic。
IsNil()
常被用于判断指针是否为空;IsValid()
常被用于判定返回值是否有效。
03.结构体与反射
3.1 查看类型、字段和方法
3.2 查看匿名字段
3.3 修改结构体的值
3.4 调用方法
3.5 获取字段的tag
04.反射练习
- 任务:解析如下配置文件
- 序列化:将结构体序列化为配置文件数据并保存到硬盘
- 反序列化:将配置文件内容反序列化到程序的结构体
- 配置文件有server和mysql相关配置
reflect
http://coderedeng.github.io/2022/06/05/Go常用库介绍 - reflect/