Go reflect包:运行时反射机制
学习使用reflect包在运行时检查类型、获取字段标签、动态调用方法和修改值。 · 难度:入门 · +15XP
Go reflect包:运行时反射机制
反射(Reflection)是程序在运行时检查自身结构和行为的能力。Go的reflect包提供了强大的反射功能,包括类型检查、值获取、方法调用等。常用于ORM、序列化库和测试框架。
1. 基本概念:Type和Value
反射的核心是两个类型:reflect.Type(表示类型)和reflect.Value(表示值)。通过reflect.TypeOf()和reflect.ValueOf()获取。
var x float64 = 3.14
t := reflect.TypeOf(x) // float64
v := reflect.ValueOf(x) // 3.14
fmt.Println(t.Name()) // float64
fmt.Println(v.Kind()) // float64 (Kind是底层类型)
fmt.Println(v.Float()) // 3.14
2. 获取结构体字段和标签
反射常用于解析结构体标签(struct tags),如JSON标签。
type User struct {
Name string json:"name" validate:"required"
Age int json:"age"
}
u := User{"Alice", 30}
t := reflect.TypeOf(u)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fmt.Printf("Field: %s, JSON tag: %s
",
field.Name, field.Tag.Get("json"))
}
3. 修改值(通过指针)
要修改反射获取的值,必须传递指针,并使用Elem()获取可设置的值。
var y float64 = 2.71
v = reflect.ValueOf(&y).Elem() // 获取指针指向的值
if v.CanSet() {
v.SetFloat(3.14)
}
fmt.Println(y) // 3.14| 方法 | 说明 |
|---|---|
| Kind() | 返回底层类型(如Int、String、Struct) |
| NumField() | 结构体字段数量 |
| Field(i int) | 获取第i个字段 |
| MethodByName(name) | 按名获取方法 |
4. 练习提示
编写一个函数PrintFields,接受任意结构体,使用反射打印每个字段的名称、类型和值。注意处理嵌套结构体。