我怎样才能调用golang struct field的功能?

时间:2018-06-13 08:47:01

标签: go methods struct reflection

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

1 个答案:

答案 0 :(得分:0)

vf已经是reflect.Value类型,您不必将其传递给另一个reflect.ValueOf()来电。

只需在vf上致电MethodByName()

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

输出将是(在Go Playground上尝试):

*main.T
ptr
foo