golang 反射的函数和方法的总结
目录
- 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 的反射机制可以灵活地操作变量、类型和结构体,适用于需要动态处理的场景(如测试框架、序列化工具等)。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号