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: call of reflect.Value.Call on zero Valuegoroutine 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