当前位置:首页 > 后端 > 正文内容

【GO】为什么说go的“继承”并不是真正的继承?

virtualman2周前 (03-21)后端89

昨天和一个朋友在讨论这个问题,他提到在学习go的时候,有弹幕说,这并不是继承,而是组合。我说:我也是这么认为的,今天就详细解释一下,为什么这么说。

在讨论Go语言中继承与组合的问题时,我们需要明确几个关键概念:

继承与组合的定义

继承:继承是一种面向对象编程的核心概念,表示一个类(子类)从另一个类(父类)继承属性和方法,形成层级关系。子类可以重用父类的功能,并在此基础上扩展或修改。继承建立的是“is-a”关系,即子类是父类的一种特殊形式。

组合:组合是将一个对象作为另一个对象的成员变量,从而实现功能复用。组合建立的是“has-a”关系,即一个对象拥有另一个对象作为其属性。组合更灵活,允许在运行时动态替换对象。

Go语言中没有传统意义上的继承

Go语言并不支持传统的继承机制,而是通过组合来实现类似继承的功能。Go的设计哲学强调组合优于继承,这种设计使得代码更加灵活和可维护。

Go语言中的组合实现方式

  • 结构体嵌套:通过在一个结构体中嵌套另一个结构体,可以实现类似继承的效果。例如:

    type Animal struct {
        name string
    }
    type Dog struct {
        Animal
    }

    这种方式使得Dog结构体继承了Animal的字段和方法。因此可以使用 Animal 结构体的 name 字段,从感官上类似「继承」的效果,但是实际上不需要类似Java的 extends 关键字来显式声明继承关系。

  • 匿名字段:通过匿名字段嵌套,可以实现更复杂的继承逻辑。例如:

    type Cat struct {
        Animal
    }

    这种方式允许CatDog分别继承Animal的特性。

  • 接口实现:通过接口,可以定义行为规范,使得不同类型的对象可以通过实现相同的接口来表现出相似的行为。例如:

    type IAnimal interface {
        Eat()
    }
    
    type Dog struct {
        Animal
    }
    
    func (d Dog) Eat() {
        fmt.Println("Dog is eating.")
    }

    这种方式实现了多态性,进一步增强了代码的灵活性。

组合的优势

Go语言的设计者明确表示,组合优于继承。这种设计符合Go的鸭子类型(Duck Typing)理念,即关注对象能做什么,而非其本质。Go语言通过组合和接口实现了面向对象编程的核心特性,同时避免了传统继承带来的复杂性和潜在问题。

相对于继承,组合提供了一个更为灵活、强大的代码复用机制。组合模型中,一个对象(称为复合对象)可以包含另一个对象(称为组件对象),复合对象可以使用组件对象的行为。

相关文章

【已解决】SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in

【已解决】SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in

改一个老项目,然后配置完成突然就报错了,MySQL是5.7的版本。这个错误是MySQL在严格模式下特有的,当你尝试查询一个表但SELECT语句中列出的某些字段并没有明确出现在GROUP BY子句中时,就会触发这个错误。这是为了防止不确定的结果,因为在没有明确的聚合函数(如SUM、AVG、MAX等)的...

FastAPI、Go 和 Node.js 性能对比

在现代后端开发中,选择合适的编程语言和框架对于构建高性能、高扩展性的应用至关重要。FastAPI、Go 和 Node.js 是目前非常流行的三种技术栈,它们各自有独特的优势和适用场景。本文将从性能角度对这三者进行对比分析,帮助开发者更好地选择适合项目需求的技术方案。 性能对比为了全面评估这三种...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。