Go 带有指针类型为won'的接收器的方法;反射中的t列表

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() {

我试图通过使用反射来调用一个类型的所有方法来概括我的代码。它简单明了,但有一个问题,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())
}
你可以跑进去。 它打印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
的类型不是指针。它为您传入的参数提供类型。