package main
import (
"fmt"
"reflect"
)
// 定义结构体
type Person struct {
Name string
Age int
}
func main() {
// 创建结构体实例
p := Person{
Name: "John",
Age: 30,
}
// 使用反射获取结构体值
valueOf := reflect.ValueOf(p)
// 判断是否为结构体类型
if valueOf.Kind() != reflect.Struct {
fmt.Println("Not a struct")
return
}
// 遍历结构体字段
for i := 0; i < valueOf.NumField(); i++ {
field := valueOf.Field(i)
fmt.Printf("%s: %v\n", valueOf.Type().Field(i).Name, field.Interface())
}
}
关键步骤解释:
- 获取反射值:使用
reflect.ValueOf(p)
获取结构体实例 p
的反射值,这样可以操作该实例的字段。
- 类型判断:通过
valueOf.Kind() != reflect.Struct
判断获取到的值是否为结构体类型,如果不是则结束程序。
- 遍历字段:使用
valueOf.NumField()
获取结构体的字段数量,然后通过循环和 valueOf.Field(i)
获取每个字段的反射值。
- 获取字段名称和值:使用
valueOf.Type().Field(i).Name
获取字段名称,field.Interface()
获取字段的值,并打印输出。