TypeOf()和ValueOf()函数
-
TypeOf() 这个函数可以接收任何类型的参数,会返回一个该参数的相关参数(接口类型)
-
ValueOf 这个函数可以传入任意类型的参数,能够返回一个结构体类型
-
这里绑定ValueOf函数传入参数返回的value结构体
-
可以使用该结构体绑定的相应方法如下所示:
反射入门:
下边两图为反射类型转换的重要图示
// 演示reflect的快速入门
package main
import (
"fmt"
"reflect"
)
// 演示反射 函数参数为空接口则可传入任意类型
func reflectlist(a interface{
}){
// 通过反射获取传入参数的 type/kind/值
// 1.先获取到reflect.Type
// func TypeOf(i interface{})
rTyp := reflect.TypeOf(a)
fmt.Println(rTyp)
// 2.获取到reflect.Value [func ValueOf(i interface{}) Value]
rValue := reflect.ValueOf(a)
// rValue真实type并不是int类型而是reflect.Value
fmt.Printf("rValue type = %T value = %v\n",rValue,rValue)
// rValue.Int()将其类型转为int64,就可以实现int类型操作
rInt := rValue.Int()
fmt.Printf("rInt type = %T value = %v\n",rInt,rInt+10)
// 将rValue转为interface{}
iv := rValue.Interface()
num2 := iv.(int)
fmt.Printf("num2 type = %T value = %v\n",num2,num2)
}
func main(){
a := 10
reflectlist(a)
}
int
rValue type = reflect.Value value = 10
rInt type = int64 value = 20
num2 type = int value = 10
上边这个不太好解释,反射根本上就是运行时反射,通过reflect.ValueOf()可以返回该变量由接口保管的值,然后可以将该值转为interface{}空接口类型,但是运行时仍然是传入的变量类型,所以如果要对该变量值进行操作就需要通过类型断言就行转化才能进行操作
演示对struct类型的反射操作:
package main
import (
"fmt"
"reflect"