欢迎光临散文网 会员登陆 & 注册

Go语言反射

2022-10-25 19:00 作者:苦茶今天断更了吗  | 我要投稿

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,定义一个适配器函数用作统一处理接口【了解】

④使用反射操作任意结构体类型。【了解】

⑤使用反射创建并操作结构体。

 


Go语言反射的评论 (共 条)

分享到微博请遵守国家法律