Go reflect包:运行时反射与元编程
掌握Go reflect包,在运行时检查类型、调用方法和修改值 · 难度:入门 · +15XP
Go reflect包核心概念
reflect包允许程序在运行时检查任意对象的类型和值,甚至修改值或调用方法。它主要用于序列化库、ORM、测试工具等场景。
1. 两个核心类型
reflect.Type:表示Go类型reflect.Value:表示Go值
通过reflect.TypeOf()和reflect.ValueOf()获取。
2. 类型检查
var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("Type:", v.Type()) // float64
fmt.Println("Kind:", v.Kind()) // float64Kind比Type更底层,例如type MyInt int的Type是MyInt,Kind是int。
3. 修改值(需要可寻址)
要修改值,必须传入指针:reflect.ValueOf(&x).Elem(),然后使用SetXxx方法。
4. 调用方法
method := v.MethodByName("MethodName")
result := method.Call([]reflect.Value{arg})5. 常用方法表格
| 方法 | 作用 |
|---|---|
| NumField() | 获取结构体字段数量 |
| Field(i) | 获取第i个字段 |
| NumMethod() | 获取方法数量 |
| Call(args) | 调用方法 |
练习提示
在starter_code中,请使用反射打印Person结构体的所有字段名和值,然后调用SayHello方法。提示:使用reflect.TypeOf(p).NumField()遍历字段。