go - 继承和接口(interface)

标签 go struct types interface

我想表达许多语言都拥有的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/

相关文章:

c - 无法从文本文件读取数据并将其放入结构和 union 以在另一个文本文件和输出窗口中获取输出

c++ - 删除列表中的结构元素

angular - 为什么我无法获得体形 Angular

json - 如何告诉客户端他们需要从 Go 服务器发送整数而不是字符串?

php - 高语 : create a function that accept an interface (I came from PHP)

java - 'instanceof' 的泛型运行时检查

java - 在 Java 中,List<Object> 与 List< 有何不同?扩展对象>?

go - 如何查找未分配的结构字段

C:链表困惑

python - 检查列表是否包含另一个列表中存在的所有类型的元素