反射的应用-基础类型转换
基础类型转换
有了上面转换的基础知识做铺垫,我们尝试实现一个反射基本操作。
将基础数据类型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