覆盖 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
,并且
- 用我自己的
覆盖它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
定义 String
:func (b Bar) String() string
.
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
,并且 - 用我自己的 覆盖它
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
定义 String
:func (b Bar) String() string
.