Go语言反射
Go语言反射
①反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind)。
②如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)。
③通过反射,可以修改变量的值,可以调用关联的方法。
④使用反射,需要 import (“reflect”)
反射应用场景:
①不知道接口调用哪个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射。例如以下这种桥接模式。
func bridge(funcPtr interface, args ...interface0{})
第一个参数funcPtr以接口的形式传入函数指针,函数参数args以可变参数的形式传入,bridge函数中可以用反射来动态执行funcPtr函数。
②对结构体序列化时,如果结构体有指定Tag,也会使用到反射生成对应的字符串。
反射重要的函数和概念:
①reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型
②reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型reflect.Value是一个
结构体类型。通过reflect.Value,可以获取到关于该变量的很多信息。
③变量、interface{} 和 reflect.Value是可以相互转换的,这点在实际开发中,会经常使用到。


快速入门:
①演示对(基本数据类型、interface{}、reflect.Value)进行反射的基本操作。

②演示对(结构体类型、interface{}、reflect.Value)进行反射的基本操作。

反射的注意事项和细节:
①reflect.Value.Kind,返回的是一个常量,Kind代表Type类型值的具体分类,零值表示非法分类。
②Type和Kind 的区别:
Type是类型,Kind 是类别,Type和Kind可能是相同的,也可能是不同的。
比如:var num int = 10;num 的Type和Kind都是int。
比如:var stu Student;stu的Type是 pkg1.Student,Kind是struct。
④使用反射的方式来获取变量的值(并返回对应的类型),要求数据类型匹配,比如x是int,那么就应该使用reflect.Value(x).Int(),而不能使用其它的,否则报panic。
⑤通过反射的来修改变量,注意当使用SetXxx方法来设置,需要通过对应的指针类型来完成,这样才能改变传入的变量的值,同时需要使用到reflect.Value.Elem()方法。

⑥reflect.Value.Elem()

反射课堂练习:
①给你一个变量var v float64= 1.2,请使用反射来得到它的reflect.Value,然后获取对应的Type,Kind和值,并将reflect.Value转换成interface{},再将interface{}转换成float64。

反射最佳实践:
①使用反射来遍历结构体的字段,调用结构体的方法,并获取结构体标签的值。



②使用反射的方式来获取结构体的tag标签,遍历字段的值,修改字段值,调用结构体方法(要求:通过传递地址的方式完成,在前面案例上修改即可)
③定义了两个函数 test1 和 test2,定义一个适配器函数用作统一处理接口【了解】
④使用反射操作任意结构体类型。【了解】
⑤使用反射创建并操作结构体。