go reflection

refletion 反射

1、首先我们研究一下go反射是什么

Go 语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制。

2、反射能干嘛?

考虑可能有两种情况

1、参数的入参是空的interface,也就是说参数的入参需要在该函数被执行的时候,才能知道这个入参到底是什么类型。
这种情况产生的原因: 往往是函数定义的时候,希望该入参可以支持很多的数据类型,或者说定义该函数的时候,并没有想好这个入参应该是什么数据类型。

2、程序在执行到一处代码的时候,它到底要调用哪一个函数,取决于当前传递的数据是什么规则,而不同的规则需要调用不同的函数,这种情况下也需要用到反射。

3、反射的实例

首先go的反射有非常著名的三大法则。

1.Reflection goes from interface value to reflection object.(反射能够将 interface 中的类型和值转换成真实的反射对象。)
2.Reflection goes from reflection object to interface value.(反射能够将真实的反射对象转变成真实类型。)
3.To modify a reflection object, the value must be settable.(如果像修改反射生成的反射对象,这个数值必须是可修改的。)

反射的实现是以空接口作为基础的,可以说空的接口是反射实现的基石。空接口类似于C语言中的void*,它可以转换成任何类型的数值。
当我们使用反射特性时,实际上用到的就是存储在 interface 变量中的和类型相关的信息

Go中的反射,在使用中最核心的就两个函数:

reflect.TypeOf(x)
reflect.ValueOf(x)

我们分开每个法则做解释

法则一
在这里插入图片描述说白了就是接口类型能通过反射的两个核心对象转换成反射对象

法则二

在这里插入图片描述
就是法则一的逆
从反射对象能够转换成接口

法则三

法则三就直译就可以了

就是通过修改反射对象,能够修改原接口值。

4、go反射的原理

反射的实现是以空接口作为基础的,可以说空的接口是反射实现的基石。
当我们使用反射特性时,实际上用到的就是存储在 interface 变量中的和类型相关的信息,也就是常说的 <type, value>。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值