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)for i := 0; i < t.NumField(); i++ {field := t.Field(i)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 = 42modifyValue(&x)fmt.Println(x) // 输出: 100
}
反射用处
- 通用库开发:如 JSON 序列化/反序列化(encoding/json)、ORM 框架等。
- 动态类型处理:需要根据类型名称或字段动态处理数据。
- 插件化系统:动态加载模块并调用方法。
- 测试工具:自动化测试中动态调用函数。