反射的应用-基础类型转换

未匹配的标注

基础类型转换

有了上面转换的基础知识做铺垫,我们尝试实现一个反射基本操作。

将基础数据类型int转成Interface,再获取其reflect.Type类型和reflect.Value类型。结合Value的方法使用变量,最后将reflect.Value类型转成 interface,再通过类型断言,转成原始的基础int类型。

func reflectTest(i interface{})  {
   // 获取 变量的 reflect.Type
   reType := reflect.TypeOf(i)
   fmt.Println("reflect.Type=", reType)

   // 获取 变量的 reflect.Value
   reVal := reflect.ValueOf(i)
   fmt.Println("reflect.Value=", reVal)   // 输出结果为100 ,但这个100可以做运算吗?
   //n := 200 + reVal 
    // err:Invalid operation: 200 + reVal (mismatched types untyped int and Value)
   fmt.Printf("reflect.Value= %v, type= %T\n", reVal, reVal)

   // 将 reVal 转化成 interface
   iVal := reVal.Interface()
   // 将 interface 通过类型断言 转回成 int
   num := iVal.(int)
   fmt.Printf("num = %v, type = %T\n", num, num)
}

func main() {
   // 定义 int 类型变量 num
   var num int = 100

   // 调用反射测试函数
   reflectTest(num)
}

需要特别指出的是,reflect.ValueOf(i) 返回的reVal 的值打印是对应的num变量的值,为100。但,这个100却不能进行加减运算,而使用fmt.Printf() 的 %T 去查看reVal 的类型,发现它并不是int类型,而是reflect.Value类型。

如果我们想使用这个 reVal进行运算,势必要用到reflect.Value类型提供的方法,将其按照int类型来进行运算。可以使用 函数Int() 来完成。

func (v Value) Int() int64

返回v持有的有符号整数(表示为int64)。 测试:

reVal := reflect.ValueOf(i)
n := 200 + reVal.Int()
fmt.Printf("n= %v, type= %T\n", n, n)

输出结果,n= 300, type= int64

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

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


暂无话题~