Golang отражение MethodByName () - PullRequest
       1

Golang отражение MethodByName ()

0 голосов
/ 05 апреля 2020

Я пишу код, который заполняет структуры данных в зависимости от его типа. Мне нужно вызвать вложенную функцию структуры, если она существует.

Почему я получаю нулевое значение при поиске функции, когда поле правильное?

type (

    SomeData struct {
        Val NestedType
    }

    NestedType struct {
        V1 string
    }
)

func (t *NestedType) FillData(v int) {
    t.V1 = fmt.Sprintf("Here is %v", v)
}

func main() {

    i := SomeData{}

    reflect.ValueOf(&i.Val).MethodByName("FillData").Call([]reflect.Value{reflect.ValueOf(555)})
    fmt.Println(i) /// {{I hate 555}}


    // BUT!

    v := 666

    newObj := reflect.New(reflect.TypeOf(SomeData{}))

    fVal := newObj.Elem().FieldByName("Val")
    fmt.Println( "fVal.NumField():", fVal.NumField()) //fVal.NumField(): 1


    f := fVal.MethodByName("FillData")
    f.Call([]reflect.Value{reflect.ValueOf(v)}) //panic: reflect: call of reflect.Value.Call on zero Value


}

1 Ответ

1 голос
/ 05 апреля 2020

Метод находится на приемнике указателя. Значение fVal является NestedType. Позвоните Value.Addr , чтобы получить *NestedType:

    f := fVal.Addr().MethodByName("FillData")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...