我试图通过使用反射调用类型的所有方法来概括我的代码。它很简单直接,但是有一个问题,reflection.TypeOf(T).NumMethods(或其他方法)忽略了使用接收器类型作为指针的方法。 例如,这个小代码将打印1而不是2:
package main
import (
"fmt"
"reflect"
)
type Foo struct {}
func (f Foo) Bar() {}
func (f *Foo) Baz() {}
func main() {
obj := Foo{}
fmt.Println(reflect.TypeOf(obj).NumMethod())
}
您可以在playground中投放。 由于Bar方法,它打印1。如果从Baz中删除指针(*),它将打印2。
我的问题是,无论接收器类型如何,我如何列出所有方法。
由于
答案 0 :(得分:0)
您可以使用obj
的指针来获取所有方法:
func main() {
obj := &Foo{}
fmt.Println(reflect.TypeOf(obj).NumMethod())
}
答案 1 :(得分:0)
获取指针类型接收器的方法指针。如果您想使用反射按名称调用方法,请输入代码。
package main
import (
"fmt"
"reflect"
)
type Foo struct{}
func (f Foo) Bar() {
fmt.Println("Inside Bar")
}
func (f *Foo) Baz() {
fmt.Println("Inside Baz")
}
func main() {
rfl := reflect.ValueOf(&Foo{})
v := rfl.MethodByName("Baz")
results := v.Call(nil)
fmt.Printf("%#v\n", results)
fmt.Println(reflect.TypeOf(&Foo{}).NumMethod())
}