golang反射

发布于:2025-03-07 ⋅ 阅读:(13) ⋅ 点赞:(0)

https://www.bilibili.com/video/BV1gf4y1r79E?p=23

reflect包

  1. 反射的作用:在运行时检查数据的类型和值
  2. 核心函数
    • reflect.TypeOf:获取一个值的类型
    • reflect.ValueOf:获取它的值
    • reflect.New:创建一个指向该类型的新指针。也就是说,为传入的类型分配内存,并返回一个指向该内存的指针的反射值。
  3. 读取结构体字段,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"))
    }
}
  1. 动态调用函数
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
}
  1. 修改值
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
}

反射用处

  1. ​通用库开发:如 JSON 序列化/反序列化(encoding/json)、ORM 框架等。
  2. ​动态类型处理:需要根据类型名称或字段动态处理数据。
  3. ​插件化系统:动态加载模块并调用方法。
  4. ​测试工具:自动化测试中动态调用函数。