为了账号安全,请及时绑定邮箱和手机立即绑定

Go中通过反射修改struct中的空指针字段

Go中通过反射修改struct中的空指针字段

Go
蛊毒传说 2023-06-05 17:42:14
我试图通过反射循环修改空指针字段“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))

在操场上运行


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信