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