猿问

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

我试图通过反射循环修改空指针字段“MyField”的间接值。我感到恐慌:反映:在零值上调用 reflect.Value.Set。

关于如何做的任何想法?

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)

}


多谢!


蛊毒传说
浏览 116回答 1
1回答

慕村9548890

该程序有两个问题。无法设置该字段,因为v它不是可寻址的值。要获取可寻址值,请从指向的指针创建一个 reflect.Value&nbsp;s:s&nbsp;:=&nbsp;MyStruct{} v&nbsp;:=&nbsp;reflect.ValueOf(&s).Elem()该程序试图通过一个 nil 指针设置一个值。反射代码与*s.MyField = "some changed name".&nbsp;如果问题中的 MyField 为 nil,则此语句将 panic。要解决此问题,请将指针设置到该字段中:t&nbsp;:=&nbsp;"some&nbsp;changed&nbsp;name" valueField.Set(reflect.ValueOf(&t))在操场上运行
随时随地看视频慕课网APP

相关分类

Go
我要回答