我试图通过反射循环修改空指针字段“MyField”的间接值。我感到恐慌:反映:在零值上调用 reflect.Value.Set。关于如何做的任何想法?https://play.golang.org/p/IJvA_J_cD60package mainimport ( "fmt" "reflect")type MyStruct struct { MyField *string}func main() { s := MyStruct{} v := reflect.ValueOf(s) for i := 0; i < v.NumField(); i++ { valueField := v.Field(i) fieldName := v.Type().Field(i).Name if fieldName == "MyField" && valueField.Kind() == reflect.Ptr { valueField.Elem().Set(reflect.ValueOf("some changed name")) fmt.Printf("the elem after change: %v\n", valueField.Elem()) } } fmt.Print(*s.MyField)}多谢!
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
该程序有两个问题。
无法设置该字段,因为v
它不是可寻址的值。要获取可寻址值,请从指向的指针创建一个 reflect.Value s
:
s := MyStruct{} v := reflect.ValueOf(&s).Elem()
该程序试图通过一个 nil 指针设置一个值。反射代码与*s.MyField = "some changed name"
. 如果问题中的 MyField 为 nil,则此语句将 panic。要解决此问题,请将指针设置到该字段中:
t := "some changed name" valueField.Set(reflect.ValueOf(&t))
- 1 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消