网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
什么是反射?
反射是一种程序运行时检查、修改其自身结构的能力。在Go语言中,reflect
包提供了实现反射的API。使用反射时,最常用的两个类型是reflect.Type
和reflect.Value
。reflect.Type
表示Go值的类型,而reflect.Value
表示Go值的具体值。
反射的基本使用
要使用反射,首先需要导入reflect
包。以下是使用反射的基本步骤:
- 从一个接口值获取反射对象(
reflect.Type
和reflect.Value
)。 - 使用反射对象获取类型或值的信息。
- 根据需要修改值。
示例:反射读取和设置值
让我们通过一个示例来展示如何使用反射读取和设置结构体的字段值。我们将定义一个简单的结构体,并使用反射来动态地读取和修改它的字段。
定义结构体
首先,定义一个简单的结构体Person
:
type Person struct {
Name string
Age int
}
使用反射读取字段值
然后,编写一个函数来使用反射读取Person
结构体实例的字段值:
package main
import (
"fmt"
"reflect"
)
func printFields(person interface{}) {
val := reflect.ValueOf(person)
for i := 0; i < val.NumField(); i++ {
field := val.Type().Field(i)
value := val.Field(i)
fmt.Printf("%s: %v\n", field.Name, value.Interface())
}
}
使用反射设置字段值
接下来,编写一个函数来使用反射设置Person
结构体实例的字段值:
func setAge(person interface{}, newAge int) {
val := reflect.ValueOf(person).Elem()
ageField := val.FieldByName("Age")
if ageField.IsValid() && ageField.CanSet() {
ageField.SetInt(int64(newAge))
}
}
包含主函数的完整代码
最后,编写主函数来演示如何使用上述函数:
package main
import (
"fmt"
"reflect"
)
type Person struct {
![img](https://img-blog.csdnimg.cn/img_convert/d196fb0371c71a443d1bd99550264a70.png)
![img](https://img-blog.csdnimg.cn/img_convert/826fc200ac184ccf42cc465f1df8315e.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
s/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**