Изменить поле нулевого указателя в структуре с помощью отражения в Go - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь изменить косвенное значение поля нулевого указателя «MyField» через цикл отражения.Я получаю панику: отражение: вызов рефлекса. Значение. Установить на ноль. Значение.

Любые идеи о том, как это сделать?

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 Ответ

0 голосов
/ 08 февраля 2019

Есть две проблемы с программой.

Поле не может быть установлено, поскольку v не является адресуемым значением.Чтобы получить адресуемое значение, создайте отражающее значение из указателя на s:

s := MyStruct{}
v := reflect.ValueOf(&s).Elem()

Программа пытается установить значение с помощью нулевого указателя.Код отражения идентичен *s.MyField = "some changed name".Это утверждение вызовет панику, если MyField равен нулю, как в вопросе.Чтобы это исправить, установите указатель на поле:

t := "some changed name"
valueField.Set(reflect.ValueOf(&t))

Запустите его на игровой площадке

...