关于 GO 反射很多人对这块非常模糊,而官方的介绍又太专业,用简单的话描述一下
关于反射(reflect )在 Golang 中文标准库中是这样介绍的
reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值。
抽取出来我们看到以下几点:
1. 运行时,允许程序操作任意类型的对象
正常情况下,我们操作一个结构体或者对象里的字段或方法时,我们都需要率先知道我们要操作的结构体和对象是什么类型,只有知道是什么类型后才能调用。虽然我们可以对拿到的数据进行类型转换,但是在类型转换的过程中,不依然还是指定了要转成的类型吗,因此反射就是在程序运行的过程中,可以对一个未知类型的数据进行操作的过程。一句话来说就是啥也不知道,但就是要用
2. interface{}保存一个值
既然要用,那么如何使用呢?解释里面说的很清楚,通过 interface{} 空接口存储要处理未知类型的数据,那为什么要用 interface{} 来接收呢,答案是因为 Golang 中的空接口没有定义任何方法,任何类型变量都实现空接口,因此用空接口可以表示任意数据类型
3. ValueOf,TypeOf函数
通过调用上面俩个函数,就可以获得 Value 类型值和 Type 类型值,Value 代表这个未知类型里面的数据,可以通过函数对数据进行操作,Type 代表这个未知类型代表着数据类型,比如 int、string、指针、结构体 Student 等。
关于反射的具体落实,主要用于框架的开发,而一般开发中相对较少,毕竟在框架中对于操作的数据很多情况下都是未知的。
以上就是个人对反射的理解,能力有限,如有错误请留言
若你理解了文章且有帮助,不妨点个赞,是对作者的认可,谢谢