正如前面所说,反射一个非常重要的作用就是动态改变变量的值,从而在运行时实现通用性极强的一些功能
设置基本类型
设置一个基本类型变量的值是最基本的操作,主要有以下几步:
- 通过 reflect.ValueOf() 获取变量对应的 Value 对象,需要注意的是,此步骤必须对变量取地址后获取,否则接下来一步将无法设置
- 通过 Value 对象的 Elem() 方法获取到指针引用的内存变量并设置为可寻址
- 通过 Elem() 方法返回的 Value 对象的 Set() 方法,我们就可以设置相同类型的值了
打印出了:
new iVal is: 13
设置 slice 元素或数组元素
与上述设置基本类型的程序十分类似,只是获取内存地址并设为可寻址的 Elem() 方法改为 Index(i int) 方法
需要注意的是,在获取目标类型指针对应的 Value 对象时,我们需要区分:
- slice 本身持有数组的指针,所以无需通过 & 运算获取地址
- 对于数组来说,& 运算符获取数组的地址是必须的
打印出了:
new aVal[0] is: 13
设置可寻址的结构体字段
对于结构体,我们必须要指定需要设置的字段,Value 类型提供了 FieldByName 方法用来实现这个功能
打印出了:
student is: {1 Nico 99}