通过反射在Go中修改结构体中的空指针字段

4
我正在尝试通过反射循环修改空指针字段"MyField"的间接值。但是我遇到了一个错误:reflect: call of reflect.Value.Set on zero Value。
你有什么想法吗? https://play.golang.org/p/IJvA_J_cD60
package main

import (
    "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个回答

5
程序有两个问题。
由于`v`不是一个可寻址的值,因此无法设置该字段。要获取可寻址的值,请从指向`s`的指针创建一个反射`Value`。
s := MyStruct{}
v := reflect.ValueOf(&s).Elem()

该程序试图通过一个空指针设置一个值。反射代码与*s.MyField = "some changed name"相同。如果MyField为空,那么这个语句将会触发panic。为了修复这个问题,在字段中设置一个指针即可。
t := "some changed name"
valueField.Set(reflect.ValueOf(&t))

在Playground上运行代码


非常感谢!在这种情况下,我知道字段类型。如果我想用指向类型的空/零值(即在这种情况下为空字符串)初始化字段,该怎么办?对此有什么想法吗? - pmrs
1
valueField.Set(reflect.New(valueField.Type().Elem())) - Charlie Tumahai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接