golang 反射_golang的反射机制

本文深入探讨Go语言中的反射机制,解释了反射在编程中的重要性,特别是在框架开发中实现松耦合和高复用的场景。通过反射,可以在运行时操作任意类型对象,包括获取信息、修改值、调用方法和创建对象。反射的原理涉及通过`reflect.TypeOf()`和`reflect.ValueOf()`获取反射类型和值,然后利用这些对象对原变量进行操作。文中还提到了Type与Kind的区别,并通过实例展示了如何使用反射。学习反射有助于编写更通用的代码,降低耦合度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

反射机制是一个很重要的内容,当我们写框架的时候,要想要松耦合,高复用,那么就有很多地方都需要用到反射,可谓是中高级程序员必须掌握的知识点

很多后台语言都有反射机制,但它们的使用原理大多都是一样的

各语言不同的地方,大致就是代码实现方式不一致罢了

其根本,都是从变量得到反射对象,再由反射对象去操作原变量

好了,步入正题

什么是反射

我就用一句话来概括吧

使用反射,可以让我们在程序运行时对任意类型的对象进行操作

注意操作这两个字,操作是指:可以获取对象的信息、改变对象的值、调用对象的方法、甚至是创建一个对象

说到这你可能有点困惑,我们在编写代码的时候不就已经把该实例化的象进行了实例化,该调用的方法都调用了嘛?为什么写程序的时候不调用方法,偏要在运行时去进行这些操作?

其实问题就在这里,如果我们在写程序的时候,一切的对象与方法都能够确定了,那还要反射做什么?

正是因为我们在写程序的时候,要想写一些“万能程序”,用于降低代码的耦合度,所以我们才需要反射,用于处理一些未知的对象

想想,当我们写一个方法,不管别人往我们这个方法内传入什么样的参数,最后我们的函数都能给别人所需要的内容。是不是感觉很牛逼?

反射的使用原理

我这里主要说使用反射的原理,并不是刨析反射的底层原理,有兴趣想要探索原理的读者大人,可以去看看go的reflect包源码

先给你们上个图,看懂这个关系图,后面的文字基本也就可以不看了

d5759428149cc89ddfbc465778310885.png

没看懂没关系,稍微解释就能明白~~

我们定义的一个变量,不管是基本类型int,还是一个结构体Employee,我们都可以通过reflect.TypeOf()获取他的反射类型Type,也可以通过reflect.ValueOf()去获取他的反射值Value

我们学习反射,其实就是学习如何使用原变量,去取得reflect.Type或者reflect.Value这种反射对象;再使用这个反射对象Type以及Value,反过来对原变量进行操作

弄明白了这个道理,那一切都将变得简单

剩下的,我们只是需要去学习reflect包中提供的方法。当我们需要要怎么操作变量,就使用其提供的对应方法即可

反射的注意事项与细节

Type与Kind的区别是什么?

Type是类型,Kind是类别,听起来有点绕,他们之间的关系为Type是Kind的子集

如果变量是基本类型,那么Type与Kind得到的结果是一致的,比如变量为int类型,Type与Kind的值相等,都为int

但当变量为结构体时,Type与Kind的值就不一样了

我们来看个实际案例

func main() {var emp Employeeemp = Employee{Name: "naonao
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值