dongqiang4819
dongqiang4819
2018-06-13 08:47
浏览 54
已采纳

如何调用golang结构字段的函数?

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 Value

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条回答 默认 最新

  • dongtou9934
    dongtou9934 2018-06-13 08:51
    已采纳

    vf is already of type reflect.Value, you don't have to pass that to another reflect.ValueOf() call.

    Just call MethodByName() on vf:

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

    Output will be (try it on the Go Playground):

    *main.T
    ptr
    foo
    
    点赞 评论

相关推荐