我想表达许多语言都拥有的extends
行为。
在我的 Go 代码中,我有一些看起来像这样的结构:
type Base struct {
// Some fields
}
type BaseExtender struct {
Base
// Unique fields
}
type AnotherBaseExtender struct {
Base
// Unique fields
}
现在,我想编写一个接受任何 Base
的函数,因为我只需要它的“相似字段”。
func UseTheBase(b Base) {
testVal := b.thingICareAbout
}
但是,这是行不通的。我深入研究了 interface
并认为我可以做类似的事情:
type Base interface {
// Some fields
}
除了 Go 似乎通过方法实现 自动推断接口(interface)。有没有一种方法可以模仿这种行为,这样我就可以将任何 Base
传递到我的函数中,而不必在 Base
结构及其所有扩展器上实现一些 nop 方法?
谢谢!
最佳答案
Base 意味着你想在 Go 中继承,Go 故意回避继承,不要试图重新创建它。您可以嵌入类型,但将其视为嵌入行为,而不仅仅是数据(因为您可能想在继承语言中这样做)。
您的解决方案是正确的,但需要公共(public)方法,是的,接口(interface)是根据方法定义的。只需将调用它的接口(interface)定义为:
type Doer interface {
DoSomething()
}
...
func doit(d Doer) {
d.DoSomething()
}
doit 不关心它的参数是什么,只要它有一个 DoSomething 方法。显然这是一个微不足道的例子,没有任何意义,但是如果你需要在所有扩展器中覆盖一些东西,问问你自己为什么 Base 存在,如果它只是为了添加一些字段,那可能不是一个单独类型的足够理由,只是在需要的地方添加字段。
尽量避免使用其他语言构建的大量类型分类法。
关于go - 继承和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42802229/