Go reflect:运行时反射与元编程
探索reflect包,学习如何在运行时检查类型、调用方法和修改结构体字段。 · 难度:入门 · +15XP
反射基础
Go的reflect包允许你在运行时检查任意值的类型和结构。核心类型是Type和Value,分别表示类型信息和实际值。
类型检查
var x float64 = 3.14
t := reflect.TypeOf(x)
fmt.Println(t.Name()) // float64
fmt.Println(t.Kind()) // float64值操作
v := reflect.ValueOf(x)
fmt.Println(v.Float()) // 3.14
// 修改值需要指针
p := reflect.ValueOf(&x)
p.Elem().SetFloat(2.71)
结构体遍历
type User struct {
Name string
Age int
}
u := User{"Alice", 30}
v := reflect.ValueOf(u)
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fmt.Printf("%s: %v
", v.Type().Field(i).Name, field.Interface())
}| 函数 | 用途 |
|---|---|
| TypeOf | 获取类型 |
| ValueOf | 获取值 |
| Kind | 底层类型(struct, slice等) |
| Elem | 解引用指针/接口 |
练习提示
编写一个函数PrintFields,接受任意结构体并打印所有字段名和值。如果字段是私有(非导出)的,使用v.Field(i).CanInterface()检查。