Go 带有指针类型为won'的接收器的方法;反射中的t列表
我试图通过使用反射来调用一个类型的所有方法来概括我的代码。它简单明了,但有一个问题,reflection.TypeOf(T).NumMethods(或其他方法)忽略了将接收器类型用作指针的方法。 例如,此小代码将打印1而不是2:Go 带有指针类型为won'的接收器的方法;反射中的t列表,go,Go,我试图通过使用反射来调用一个类型的所有方法来概括我的代码。它简单明了,但有一个问题,reflection.TypeOf(T).NumMethods(或其他方法)忽略了将接收器类型用作指针的方法。 例如,此小代码将打印1而不是2: package main import ( "fmt" "reflect" ) type Foo struct {} func (f Foo) Bar() {} func (f *Foo) Baz() {} func main() {
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())
}
你可以跑进去。
它打印1是因为采用了条形图方法。如果从Baz中删除指针(*),它将打印2
我的问题是,如何列出所有方法,而不考虑接收器类型
谢谢您只需使用
obj
的指针即可获得所有方法:
func main() {
obj := &Foo{}
fmt.Println(reflect.TypeOf(obj).NumMethod())
}
使用指针类型接收器获取指向方法的指针。如果您想使用反射按名称调用该方法,下面是代码
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())
}
因为传递给
TypeOf
的类型不是指针。它为您传入的参数提供类型。