如何在Go中获取结构体方法列表?

3
我有一个库,其中包括了ClientMockClient结构体,它们都实现了同样的ClientInterface接口。我想编写单元测试来保证这些结构体不仅仅是实现了接口,同时也保证MockClient具有Client的所有方法。为此,我需要获取结构体的方法列表,以便在MockClient方法缺失Client方法时打印出有用的错误信息。
我已经尝试过将如何在Go中获取函数名称?适配到这个简化的示例中:
package main

import (
    "fmt"
    "reflect"
    "runtime"
)

type Person struct {
    Name string
}

func (person *Person) GetName() string {
    return person.Name
}

func main() {
    person := Person{Name: "John Doe"}
    personValue := reflect.ValueOf(&person)

    for i := 0; i < personValue.NumMethod(); i++ {
        fmt.Println(runtime.FuncForPC(personValue.Method(i).Pointer()).Name())
    }
}

我希望这个脚本(在https://play.golang.org/p/HwvhEPfWI5I分享)能够打印出GetName。然而,实际上它输出的是
reflect.methodValueCall

我该如何让这个脚本打印出*Person的方法名?

1
注意,对于“类型*T或T实现接口I”的编译时测试:可以使用var _ I = (*T)(nil)var _ I = T{}(取决于您是测试T本身还是*T)。有关详细信息,请参见https://dev59.com/jGkv5IYBdhLWcg3wlRtc。当然,这与列出结构体的方法不同;它的用处在于当您定义一个接口并想要确保您编写的每个实现都实现了该接口时。 - torek
1个回答

6

使用类型获取方法名称:

t := reflect.TypeOf(&person)
for i := 0; i < t.NumMethod(); i++ {
    m := t.Method(i)
    fmt.Println(m.Name)
}

在播放器上运行它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接