在结构方法内部使用反射调用结构的方法

时间:2018-09-24 15:34:48

标签: go reflection

在struct方法内部,如何使用反射来调用struct方法?例如:

package main

import "fmt"
import "reflect"

type T struct{}

func (t *T) New() {
    value := getDynamicValue()
    method := reflect.ValueOf(&t).MethodByName(value)
    fmt.Println(method)
}

func (t *T) fake() {
    fmt.Println("Fake!")
}

func main() {
    var t T
    t.New()
}

func getDynamicValue() string {
    return "fake"
}

即使存在<invalid reflect.Value>,以下代码也会打印fake

提前谢谢! :)

2 个答案:

答案 0 :(得分:4)

问题在于:

  • &t而不是ValueOf传递给t
  • fake方法未导出

这是一个有效的示例:

package main

import "fmt"
import "reflect"

type T struct{}

func (t *T) New() {
    value := getDynamicValue()
    method := reflect.ValueOf(t).MethodByName(value)
    fmt.Println(method)
}

func (t *T) Method() {
    fmt.Println("Hello world!")
}

func main() {
    var t T
    t.New()
}

func getDynamicValue() string {
    return "Method"
}

输出

0xec820

Try it yourself

答案 1 :(得分:1)

您需要导出方法并调用它:

package main

import "fmt"
import "reflect"

type T struct{}

func (t *T) New() {
    value := getDynamicValue()
    method := reflect.ValueOf(t).MethodByName(value)
    fmt.Println(method.Call(nil))
}

func (t *T) Fake() {
    fmt.Println("Fake!")
}

func main() {
    var t T
    t.New()
}

func getDynamicValue() string {
    return "Fake"
}