【Go语言04-4】关于Go语言中的反射功能解读以及反射包reflect的相关API调用

【Go语言04-4】关于Go语言中的反射功能解读以及反射包reflect的相关API调用,第1张

【Go语言04-4】关于Go语言中的反射功能解读以及反射包reflect的相关API调用

反射(reflect)是Go语言提供的动态获取对象类型及结构信息的方式。
Go语言中的反射可以帮助处理未知类型,但是使用次数非常少。

反射的包为 reflect包:包含两个核心类型: reflect.Value 和 reflect.Type。
前者用于存储任意值,后者用于存储任意类型。

一、反射的使用
x1 := X{A1:100,B1:3.14,C1:true}
y1 := Y{A2:1,B2:2,C2:1.5,D2:"hello"}

rx1 := reflect.ValueOf(&x1).Elem() // rx1:  {100 3.14 true}
ry1 := reflect.ValueOf(&y1).Elem() // ry1:  {1 2 1.5 hello}

定义了两个结构体: X和Y的变量x1和y1,通过reflect.ValueOf方法获取新创建的变量的地址,一般该方法返回的是传入变量的一份值复制。

此处直接传递变量的地址,得到的也是变量的地址对象。然后调用Elem方法获取地址指针指向的值封装。

x1Type := rx1.Type()
y1Type := ry1.Type()
fmt.Println("x1Type: ",x1Type) // x1Type:  main.X
fmt.Println("y1Type: ",y1Type) // y1Type:  main.Y

通过调用Type方法可以获取变量的类型。

rx1.NumField()

NumField 方法返回 reflect.Value 结构中的字段个数。

二、反射的缺点

反射能实现动态获取对象类型,但是不建议经常使用,因为会导致代码自身的可读性较差。

反射代码的写法可读性比较差,不利于后续的运维。

反射的实现比较复杂,所以反射执行得比较慢,会影响程序的整体性能。

反射的错误在编译时无法发现,到运行时才报错,而且都是panic类型,这容易让程序崩溃。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5722139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存