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 @   guanyubo  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2024-01-27 IO多路复用
点击右上角即可分享
微信分享提示