Golang对基本数据类型和结构体进行反射

具体代码

package main


import (
	"fmt"
	"reflect"
)

//  1.对基本数据类型、interface{}、reflect.Value进行转换
func ReflectTest1(in interface{}){
	// 通过反射获取传入的变量的type, kind
	// 1.先获取到 reflect.Type
	rType := reflect.TypeOf(in)
	fmt.Printf("rType类型为%T,值为%v\n", rType, rType)

	// 2.获取到 reflect.Value
	rVal := reflect.ValueOf(in)
	fmt.Printf("rVal类型为%T,值为%v\n", rVal, rVal)
	
	// 获取变量对应的 kind
	// 1) rVal.Kind() ===>
	// 2) rType.Kind() ===>
	fmt.Printf("Kind =%v, kind =%v\n", rVal.Kind(), rType.Kind())
	
	// 3.将 rVal 转成 interface{}
	iv := rVal.Interface()
	fmt.Printf("iv类型为%T,值为%v\n", iv, iv)

	// 将 interface{} 通过类型断言转为需要的类型
	num := iv.(int)
	fmt.Printf("num类型为%T,值为%v\n\n", num, num)
}

func ReflectTest2(in interface{}){
	// 通过反射获取传入的变量的type, kind
	// 1.先获取到 reflect.Type
	rType := reflect.TypeOf(in)
	fmt.Printf("rType类型为%T,值为%v\n", rType, rType)
	
	// 2.获取到 reflect.Value
	rVal := reflect.ValueOf(in)
	fmt.Printf("rVal类型为%T,值为%v\n", rVal, rVal)

	// 获取变量对应的 kind
	// 1) rVal.Kind() ===>
	// 2) rType.Kind() ===>
	fmt.Printf("Kind =%v, kind =%v\n", rVal.Kind(), rType.Kind())

	// 3.将 rVal 转成 interface{}
	iv := rVal.Interface()
	fmt.Printf("iv类型为%T,值为%v\n", iv, iv)
	
	// 将 interface{} 通过类型断言转为需要的类型
	stu := iv.(Student)
	fmt.Printf("stu类型为%T,值为%v\n\n", stu, stu)
}

type Student struct{
	Name string
	Age int
}

func main(){
	// 1.对基本数据类型、interface{}、reflect.Value进行转换
	var num int = 100
	ReflectTest1(num)

	// 2.对结构体的反射
	var stu Student = Student{"Tom", 20}
	ReflectTest2(stu)
}

结果

posted @ 2021-02-15 20:05  pangqianjin  阅读(244)  评论(0编辑  收藏  举报