Golang 不是 Java,类型嵌入不是继承。


在 Golang 中,可以使用结构将一个类型嵌入到另一个类型中。这看起来像一个普通的字段声明,但没有名称。这是将一个结构嵌入另一个结构:

type inner struct {
    a int
}

type outer struct {
    inner
    b int
}

inner已嵌入到outer. 这为您提供了访问所有嵌入类型字段的语法快捷方式。例如,您可以这样做:

var x outer
fmt.Printf("inner.a is %d", x.a)

即使该outer结构没有名为 的字段a,嵌入式inner结构也有。这是键入以下内容的快捷方式:

var x outer
fmt.Printf("inner.a is %d", x.inner.a)

但是大多数人使用此功能的原因,尤其是我们这些来自面向对象背景的人,是因为它允许您在嵌入式类型上共享方法。乍一看,它看起来像继承(但它不是,我们将看到)。


巨大的警告:类型嵌入不是继承,假装它是会导致错误。

Go有组合而不是继承,这称为“类型嵌入”。
类型嵌入只是一种便利,可以使某些类型的代码更容易重用。乍一看确实类似于继承,对某些组合很有用,但它只不过是一个语法糖。

继承的问题之一是它混淆了两个独立的东西:代码重用和子类型多态性。Go 拥有这两者,但将它们完全分开。至少在某些情况下,存在类似继承的代码重用作为类型嵌入,但它仍然只是外部结构中的一个字段。这不是 OO 意义上的实际继承。另一方面,子类型多态性通过接口存在。


详细点击标题