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 reflect_call_1.go
* main.T ptr panic:反映:调用reflect.Value.Call零值goroutine 1 [running]:reflect.flag.mustBe(0x0,0x13)
/usr/local/go/src/reflect/value.go:201 + 0xae reflect.Value.Call(0x0, 0x0,0x0,0xc420049f00,0x0,0x0,0x0,0x0,0x40457c)
/usr/local/go/src/reflect/value.go:300 + 0x38
答案 0 :(得分:0)
vf
已经是reflect.Value
类型,您不必将其传递给另一个reflect.ValueOf()
来电。
只需在vf
上致电MethodByName()
:
vf.MethodByName("Foo").Call([]reflect.Value{})
输出将是(在Go Playground上尝试):
*main.T
ptr
foo