func reflectValueFn(x interface{}) {
v := reflect.ValueOf(x)
kind := v.Kind()
//fmt.Printf("type:%v--name:%v--kind:%v\n", v, v., v.Kind())
switch kind {
case reflect.Int64:
fmt.Printf("Int64 原始值:%v\n", v.Int())
case reflect.Int32:
fmt.Printf("Int32 原始值:%v\n", v.Int())
case reflect.Int16:
fmt.Printf("Int16 原始值:%v\n", v.Int())
case reflect.Int8:
fmt.Printf("Int8 原始值:%v\n", v.Int())
case reflect.Int:
fmt.Printf("Int 原始值:%v\n", v.Int())
case reflect.Float32:
fmt.Printf("Float32 原始值:%v\n", v.Float())
case reflect.Float64:
fmt.Printf("Float64 原始值:%v\n", v.Float())
case reflect.String:
fmt.Printf("String 原始值:%v\n", v.String())
//case reflect.Array:
// fmt.Printf("int 原始值:%v", v.)
case reflect.Bool:
fmt.Printf("Bool 原始值:%v\n", v.Bool())
//case reflect.Chan:
// fmt.Printf("int 原始值:%v", v.)
case reflect.Ptr:
fmt.Printf("Ptr 指针地址:%v\n", v.Pointer())
if v.Elem().Kind() == reflect.Int64 || v.Elem().Kind() == reflect.Int32 || v.Elem().Kind() == reflect.Int16 || v.Elem().Kind() == reflect.Int8 || v.Elem().Kind() == reflect.Int {
fmt.Printf("Ptr 原始值:%v\n", v.Elem().Int())
}
case reflect.Map:
fmt.Printf("Map 原始值:%v\n", v.MapKeys())
case reflect.Struct:
fmt.Printf("Struct 原始值:%v\n", v.String())
default:
fmt.Printf("int 原始值:%v\n", v.String())
}
}
func reflectValueFnTest() {
reflectValueFn(10)
reflectValueFn(30.3)
reflectValueFn("abc")
reflectValueFn(true)
reflectValueFn(myInt(90))
reflectValueFn(time.Now())
reflectValueFn(Student{})
var a = 9
reflectValueFn(&a)
reflectValueFn([]int{1, 2})
reflectValueFn([...]int{1, 2})
reflectValueFn([2]int{1, 2})
}
修改变量需要传指针使用
v.Elem().SetInt(64) v.Elem().Int()
v.Elem().SetString(64) v.Elem().String()
反射调用函数方法
func Tom(i int) int {
return i + 1
}
func call() {
//使用反射调用函数
v := reflect.ValueOf(Tom)
fmt.Println("反射获取到的函数为:",v)
//调用函数
call := v.Call([]reflect.Value{reflect.ValueOf(2)})
fmt.Println("调用函数计算结果后的值",call[0])
}