覆盖 Go 结构方法的默认行为

Overriding Default Behavior of a Go struct Method

Go 的基本要求与 Overriding a methods internal behavior 相同。

我有

func (f *Foo) String() string {
    return "Foo to string"
}

type Bar struct {
    *Foo
}

func (b *Bar) String() string {
    return "Bar to string"
}

我要

但是,我发现我可以覆盖正常的 Foo/Bar 函数,例如 Call(),但无法用我自己的函数覆盖 String() 函数。详细代码位于

https://play.golang.org/p/nzYQzIYlesQ

我想覆盖的实际默认行为是 --
https://godoc.org/github.com/blevesearch/bleve#SearchResult.String

可能吗?

第一:Go 中没有方法覆盖。您可以定义一个嵌入另一个类型的新类型,并为新类型定义相同的函数。这就是你在这里所做的:

type Bar struct {
    *Foo
}

这里,Bar是嵌入了一个*Foo的新类型,因此也得到了*Foo定义的所有方法。这与 Foo 的所有方法不同。为 Foo 定义的方法同时为 Foo*Foo 定义,但是为 *Foo 定义的方法只为 *Foo 而不是为 Foo 定义.

在您的示例中,String 是为 *Foo 而不是 Foo 定义的。

同样,当您定义 func (b *Bar) String() string 时,该方法是为 *Bar 定义的,而不是为 Bar 定义的。

要使您的示例有效,只需为 Bar 定义 Stringfunc (b Bar) String() string.