具有指针类型的接收器的方法不会在反射中列出

时间:2018-03-29 20:12:46

标签: 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() {
    obj := Foo{}
    fmt.Println(reflect.TypeOf(obj).NumMethod())
}

您可以在playground中投放。 由于Bar方法,它打印1。如果从Baz中删除指针(*),它将打印2。

我的问题是,无论接收器类型如何,我如何列出所有方法。

由于

2 个答案:

答案 0 :(得分:0)

您可以使用obj的指针来获取所有方法:

func main() {
    obj := &Foo{}
    fmt.Println(reflect.TypeOf(obj).NumMethod())
}

playground

答案 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())
}

Go Playground