dongqiang4819 2018-06-13 00: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 2018-06-13 00: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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?