golang 反射的函数和方法的总结


在 Go 语言的反射中,reflect 包提供了许多函数和方法来操作类型和值


1. reflect.TypeOf()

  • 功能:获取变量的类型信息。
  • 返回值reflect.Type 类型。
  • 示例
    t := reflect.TypeOf(x)
    fmt.Println("Type:", t) // 输出变量的类型
    

2. reflect.ValueOf()

  • 功能:获取变量的值信息。
  • 返回值reflect.Value 类型。
  • 示例
    v := reflect.ValueOf(x)
    fmt.Println("Value:", v) // 输出变量的值
    

3. reflect.Value.Elem()

  • 功能:获取指针指向的实际值(解引用)。
  • 返回值reflect.Value 类型。
  • 示例
    v := reflect.ValueOf(&x).Elem() // 获取指针指向的值
    

4. reflect.Value.Set()

  • 功能:设置变量的值。
  • 注意:只有可寻址的变量(如指针指向的值)才能被设置。
  • 示例
    v.SetFloat(2.71) // 修改 float64 类型的值
    

5. reflect.Value.Interface()

  • 功能:将 reflect.Value 转换为 interface{} 类型。
  • 返回值interface{} 类型。
  • 示例
    value := v.Interface() // 获取反射值的实际值
    

6. reflect.Value.Kind()

  • 功能:获取变量的底层类型(如 intfloat64struct 等)。
  • 返回值reflect.Kind 类型。
  • 示例
    kind := v.Kind() // 获取变量的底层类型
    

7. reflect.Value.NumField()

  • 功能:获取结构体的字段数量。
  • 返回值int 类型。
  • 示例
    numFields := v.NumField() // 获取结构体的字段数量
    

8. reflect.Value.Field()

  • 功能:获取结构体的某个字段的值。
  • 参数:字段的索引(从 0 开始)。
  • 返回值reflect.Value 类型。
  • 示例
    field := v.Field(0) // 获取结构体的第一个字段
    

9. reflect.Value.Call()

  • 功能:动态调用函数。
  • 参数:函数的参数列表([]reflect.Value 类型)。
  • 返回值:函数的返回值列表([]reflect.Value 类型)。
  • 示例
    result := funcValue.Call(args) // 调用函数并获取返回值
    

10. reflect.Value.IsValid()

  • 功能:检查反射值是否有效(是否存在)。
  • 返回值bool 类型。
  • 示例
    if field.IsValid() {
        fmt.Println("Field is valid")
    }
    

11. reflect.Value.CanSet()

  • 功能:检查反射值是否可以被设置。
  • 返回值bool 类型。
  • 示例
    if field.CanSet() {
        field.Set(reflect.ValueOf(newValue))
    }
    

12. reflect.Value.FieldByName()

  • 功能:通过字段名获取结构体的字段值。
  • 参数:字段名(string 类型)。
  • 返回值reflect.Value 类型。
  • 示例
    field := v.FieldByName("Name") // 获取结构体中名为 "Name" 的字段
    

13. reflect.Value.SetXxx()

  • 功能:设置特定类型的值(如 SetIntSetFloatSetString 等)。
  • 示例
    v.SetInt(42)       // 设置 int 类型的值
    v.SetFloat(3.14)   // 设置 float64 类型的值
    v.SetString("Hi")  // 设置 string 类型的值
    

14. reflect.Value.Type()

  • 功能:获取反射值的类型信息。
  • 返回值reflect.Type 类型。
  • 示例
    t := v.Type() // 获取反射值的类型
    

15. reflect.Value.Index()

  • 功能:获取切片、数组或字符串的某个索引处的值。
  • 参数:索引(int 类型)。
  • 返回值reflect.Value 类型。
  • 示例
    elem := v.Index(0) // 获取切片或数组的第一个元素
    

总结

功能 函数/方法
获取类型信息 reflect.TypeOf()
获取值信息 reflect.ValueOf()
解引用指针 reflect.Value.Elem()
设置值 reflect.Value.Set()
获取实际值 reflect.Value.Interface()
获取底层类型 reflect.Value.Kind()
获取结构体字段数量 reflect.Value.NumField()
获取结构体字段值 reflect.Value.Field()
动态调用函数 reflect.Value.Call()
检查值是否有效 reflect.Value.IsValid()
检查值是否可设置 reflect.Value.CanSet()
通过字段名获取字段值 reflect.Value.FieldByName()
设置特定类型的值 reflect.Value.SetXxx()
获取反射值的类型 reflect.Value.Type()
获取索引处的值 reflect.Value.Index()

通过这些函数和方法,Go 的反射机制可以灵活地操作变量、类型和结构体,适用于需要动态处理的场景(如测试框架、序列化工具等)。

posted @ 2025-01-27 09:56  guanyubo  阅读(156)  评论(0)    收藏  举报