【发布时间】:2020-05-06 22:56:22
【问题描述】:
我有一个库,其中有 Client 和 MockClient 结构,它们都实现了相同的 ClientInterface 接口。我想编写单元测试以使这些结构保持同步,以便它们不仅实现接口,而且使MockClient 拥有Client 的所有方法。为此,如果MockClient 中缺少Client 的方法之一,我想获取结构方法的列表,以便打印信息性错误消息。
我已尝试将 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())
}
}
我希望这个脚本(在https://play.golang.org/p/HwvhEPfWI5I 共享)打印GetName。但是,它会打印
reflect.methodValueCall
如何让这个脚本打印*Person 的方法名称?
【问题讨论】:
-
请注意,“类型 *T 或 T 实现接口 I”有一个编译时测试:
var _ I = (*T)(nil)或var _ I = T{}(取决于您是在测试T本身还是 @ 987654338@)。有关详细信息,请参阅stackoverflow.com/q/10498547/1256452。当然,这与列出结构的方法不同;它的用处在于你已经定义了一个接口,并希望确保你编写的每个实现都实现了该接口。
标签: go reflection go-reflect