反射操作普通变量-获取变量值
获取变量值
结合前面“反射的应用”章节,我们知道,变量、interface{}和reflect.Value之间是可以相互转换的。使用反射机制获取变量值时,要求数据类型匹配。即:
int类型变量v ——> reflect.Value(v).Int() 才能取值。
Float类型变量 f ——> reflect.Value(f).Float() 来进行取值。
Bool类型变量 bl ——> reflect.Value(bl).Bool() 来取变量的值。
如若传给 interface 的是 int 类型,而在函数内部使用reflect.Value(f).Float() 是不能正确取出数据值的。但需要注意的是,编译器是不能发现该错误的!只有程序运行起来,使用了反射才能报出错误:
painc:reflect:call of reflect.Value.Float on int Value.
本章开篇我们即强调过“reflect包实现了运行时反射”
如果是自定义类型。如:结构体。由于不像 int、bool、float64、string 一样,有现成的封装好的方法。如:Int()、Bool()、Float()……等方法,所以只能使用断言。
但,即使是结构体类型,其成员也是由基础数据类型组成的。因此我可以先获取到其成员的具体类别,再使用已有的方法逐一获取其数据。
获取变量类别,可以使用 Type 或 Value 的kind() 方法来实现。