面试题答案
一键面试package main
import (
"fmt"
"reflect"
)
func main() {
p := Person{Name: "Alice", Age: 30}
valueOf := reflect.ValueOf(&p).Elem()
nameField := valueOf.FieldByName("Name")
if nameField.IsValid() {
nameField.SetString("Bob")
}
ageField := valueOf.FieldByName("Age")
if ageField.IsValid() {
ageField.SetInt(35)
}
fmt.Println(p)
}
type Person struct {
Name string
Age int
}
反射调整字段值的主要步骤:
- 获取Value对象:使用
reflect.ValueOf
获取结构体实例的reflect.Value
对象,如果要修改值,需要传入结构体指针,然后通过Elem
方法获取指针指向的实际结构体的reflect.Value
。 - 定位字段:通过
FieldByName
等方法定位到要修改的字段,该方法返回一个reflect.Value
对象代表对应字段。 - 检查有效性并修改:使用
IsValid
方法检查获取的字段是否有效,若有效则使用对应的Set
方法(如SetString
、SetInt
等)修改字段的值。