面试题答案
一键面试package main
import (
"fmt"
"reflect"
)
// 定义一个结构体
type Person struct {
Name string
Age int
}
func main() {
p := Person{
Name: "Alice",
Age: 30,
}
// 获取结构体实例的反射值
valueOf := reflect.ValueOf(&p)
// 判断是否为指针类型,并获取指针指向的值
if valueOf.Kind() == reflect.Ptr {
valueOf = valueOf.Elem()
}
// 获取结构体实例的反射类型
typeOf := valueOf.Type()
// 遍历结构体的字段
for i := 0; i < valueOf.NumField(); i++ {
field := valueOf.Field(i)
fieldType := typeOf.Field(i).Type
fieldName := typeOf.Field(i).Name
fmt.Printf("Field %d: Name = %s, Type = %v, Value = %v\n", i+1, fieldName, fieldType, field.Interface())
}
// 通过反射修改字段值
if field := valueOf.FieldByName("Age"); field.IsValid() {
if field.Kind() == reflect.Int {
field.SetInt(31)
}
}
fmt.Println("Modified Person:", p)
}
上述代码中:
- 使用
reflect.ValueOf
获取结构体实例的反射值。如果是指针类型,通过.Elem()
获取指针指向的值。 - 使用
reflect.ValueOf.Type
获取结构体实例的反射类型。 - 通过
valueOf.NumField()
获取结构体字段数量,并遍历每个字段,获取字段名、类型和值。 - 使用
valueOf.FieldByName
根据字段名获取字段的反射值,判断字段是否有效且类型是否为int
,如果是则使用field.SetInt
修改字段值。