如何在Golang中转储结构体的方法?

38
Golang的"fmt"包有一个名为Printf("%+v", anyStruct)的转储方法。我正在寻找一种可以转储结构体以及其方法的任何方法。
例如:
type Foo struct {
    Prop string
}
func (f Foo)Bar() string {
    return f.Prop
}

我想检查已初始化的 Foo 类型实例中是否存在 Bar() 方法(不仅限于属性)。

有没有好的方法来做到这一点?

1个回答

56

您可以使用reflect包列出类型的方法。例如:

fooType := reflect.TypeOf(&Foo{})
for i := 0; i < fooType.NumMethod(); i++ {
    method := fooType.Method(i)
    fmt.Println(method.Name)
}

您可以在此处尝试运行:http://play.golang.org/p/wNuwVJM6vr

因此,如果您想检查类型是否实现了特定的方法集,您可能会发现使用接口和类型断言更容易。例如:

func implementsBar(v interface{}) bool {
    type Barer interface {
        Bar() string
    }
    _, ok := v.(Barer)
    return ok
}

...
fmt.Println("Foo implements the Bar method:", implementsBar(Foo{}))

或者,如果你只是想在编译时断言特定类型具有某些方法,可以在任何地方包含以下内容:

或者,如果您只想要一种类似于编译时断言的方式来确定特定类型是否具有特定方法,您可以简单地在任何地方添加以下代码:

var _ Barer = Foo{}

非常感谢!我不想使用“reflect”包,所以你使用接口的建议对我来说非常棒! - otiai10
4
要找到*T方法,您需要提供TypeOf(&Foo{}) - BG Adrian
谢谢James和@BGAdrian,你们能帮我一下如何获取方法接口吗? - Davood Falahati
1
@Davood 如何列出接口中的方法名称如何确定接口中的方法集 使用反射来实现。 - user12817546

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