golang反射
https://www.bilibili.com/video/BV1gf4y1r79E?p=23
reflect包
- 反射的作用:在运行时检查数据的类型和值
- 核心函数
- reflect.TypeOf:获取一个值的类型
- reflect.ValueOf:获取它的值
- reflect.New:创建一个指向该类型的新指针。也就是说,为传入的类型分配内存,并返回一个指向该内存的指针的反射值。
- 读取结构体字段,field就是成员变量
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func inspectStruct(u User) {
t := reflect.TypeOf(u)
v := reflect.ValueOf(u)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
value := v.Field(i).Interface() // 成员变量的值
fmt.Printf("Field: %s, Tag: %s\n", field.Name, field.Tag.Get("json"))
}
}
- 动态调用函数
func Add(a, b int) int {
return a + b
}
func main() {
funcValue := reflect.ValueOf(Add)
args := []reflect.Value{reflect.ValueOf(3), reflect.ValueOf(4)}
results := funcValue.Call(args)
fmt.Println(results[0].Int()) // 输出: 7
}
- 修改值
func modifyValue(x interface{}) {
v := reflect.ValueOf(x)
// Elem()是获取指针指向的值,CanSet方法则检查该Value是否可以被修改
if v.Kind() == reflect.Ptr && v.Elem().CanSet() {
v.Elem().SetInt(100)
}
}
func main() {
var x int = 42
modifyValue(&x)
fmt.Println(x) // 输出: 100
}
反射用处
- 通用库开发:如 JSON 序列化/反序列化(encoding/json)、ORM 框架等。
- 动态类型处理:需要根据类型名称或字段动态处理数据。
- 插件化系统:动态加载模块并调用方法。
- 测试工具:自动化测试中动态调用函数。