Как я могу вызвать функцию golang struct field? - PullRequest
0 голосов
/ 13 июня 2018
package main

import "fmt"
import "reflect"

type T struct{}

func (t *T) Foo() {
    fmt.Println("foo")
}

type A struct {
    Ts T
}

func main() {
    var t T
    var a A = A{Ts: t}
    val := reflect.ValueOf(&a).Elem()
    for i := 0; i < val.NumField(); i++ {
        vf := val.Field(i).Addr()
        fmt.Println(vf.Type())
        fmt.Println(vf.Kind())
        reflect.ValueOf(vf).MethodByName("Foo").Call([]reflect.Value{})
    }

}

$ go run refle_call_1.go
* main.T ptr паника: отражение: вызов рефлекса. Значение. Вызов на ноль Значение

вызов 1 [выполняется]: отражать.flag.mustBe (0x0, 0x13)
/usr/local/go/src/reflect/value.go:201 + 0xae refle.Value.Call (0x0, 0x0, 0x0, 0xc420049f00, 0x0, 0x0, 0x0,0x0, 0x40457c)
/usr/local/go/src/reflect/value.go:300 + 0x38

1 Ответ

0 голосов
/ 13 июня 2018

vf уже имеет тип reflect.Value, вам не нужно передавать это на другой reflect.ValueOf() вызов.

Просто позвоните MethodByName() на vf:

vf.MethodByName("Foo").Call([]reflect.Value{})

Вывод будет (попробуйте на Go Playground ):

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