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

Kur*_*eek 3 reflection go go-reflect

我有一个库,其中有ClientMockClient结构,它们都实现相同的ClientInterface接口。我想编写单元测试来保持这些结构同步,以便它们不仅实现接口,而且具有MockClient所有的Client方法。为此,我想获取结构体方法的列表,以便在 中Client缺少其中一个方法时打印信息丰富的错误消息MockClient

我尝试改编How to get the name of a function in 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())
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要的是这个脚本(在https://play.golang.org/p/HwvhEPfWI5I共享)打印GetName. 然而,相反,它打印

reflect.methodValueCall
Run Code Online (Sandbox Code Playgroud)

*Person我怎样才能让这个脚本打印 的方法的名称?

小智 6

使用类型来获取方法名称:

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

在操场上运行它