目录
- 1.
reflect.TypeOf()
- 2.
reflect.ValueOf()
- 3.
reflect.Value.Elem()
- 4.
reflect.Value.Set()
- 5.
reflect.Value.Interface()
- 6.
reflect.Value.Kind()
- 7.
reflect.Value.NumField()
- 8.
reflect.Value.Field()
- 9.
reflect.Value.Call()
- 10.
reflect.Value.IsValid()
- 11.
reflect.Value.CanSet()
- 12.
reflect.Value.FieldByName()
- 13.
reflect.Value.SetXxx()
- 14.
reflect.Value.Type()
- 15.
reflect.Value.Index()
- 总结
在 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()
- 功能:获取变量的底层类型(如
int
、float64
、struct
等)。 - 返回值:
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()
- 功能:设置特定类型的值(如
SetInt
、SetFloat
、SetString
等)。 - 示例:
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 的反射机制可以灵活地操作变量、类型和结构体,适用于需要动态处理的场景(如测试框架、序列化工具等)。