反射的应用-Interface和reflect.Value转换

未匹配的标注

反射的应用

Interface和reflect.Value转换

在反射中,变量、interface{}、reflect.Value 是可以相互转换的。实际开发中,这种应用的场景也是最多的。通常的使用方式为:

有一个interface{}作为参数的函数,专门用于做反射。如 reflectTest

var stu Student
var n int
func reflectTest(i interface{})  {
    ReVal := reflect.ValueOf(i)
    iValue := ReVal.Interface()
    v := iVal.(Student)    
}

这个函数既可以指向 普通的 int 类型变量,也可以指向复杂的自定义struct结构体类型变量。因此,可以在reflectTest内部使用 reflect.ValueOf() 函数将 interface{} 转成 reflect.Value 类型。

interface{} ——> reflect.Value
使用的方法为:

ReVal := reflect.ValueOf(i)

本方法返回v当前持有的值

iVal := ReVal.interface()

针对返回的这个 interface 我们可以使用类型断言,切实的指向一个具体的数据类型。

interface{} ——> 原有的变量类型

v := iVal.(Student)            // 可将v转为 结构体 Student类型
v := iVal.(int)                // 可将v转为 基础 int 类型

总的来说,在反射中,变量、interface{}、reflect.Value类型之间可以遵循这样的转换关系。

变量 ——> 传参interface ——> valueOf() ——> reflect.Value ——> 调用Interface()函数——> interface() ——> 断言 ——> 变量

如图所示:

反射的应用

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~