news 2026/4/15 13:07:53

为什么go和rust语言都舍弃了继承?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么go和rust语言都舍弃了继承?

Go 和 Rust都故意不提供传统的类继承(class inheritance),核心原因高度一致:继承虽然看起来方便,但长期来看它带来的问题往往大于它解决的问题。两门语言的设计者都把“组合优于继承”(Composition over Inheritance)当作重要的设计原则,并通过语言机制强制或强烈引导开发者往这个方向走。

下面从实际痛点、设计哲学和语言提供的替代方案三个维度来拆解为什么它们选择“舍弃”继承。

1. 继承在大型项目中真正带来的主要问题(也是被舍弃的主因)

问题类型继承带来的典型表现为什么在现代大规模工程中很致命Go / Rust 亲身经历的教训来源
紧耦合 & 脆弱基类问题子类严重依赖父类实现细节,改父类容易炸子类父类一改动,整个继承树都可能需要修改或重测C++ / Java 大型代码库的真实灾难
菱形继承 / 多重继承地狱多继承导致命名冲突、虚继承、内存布局复杂调试和理解成本爆炸C++ 的历史包袱
语义不清晰(is-a vs has-a 滥用)把“has-a”关系错误地写成“is-a”继承领域模型扭曲,后期重构极难Java / C# 企业项目常见反例
实现继承 vs 接口继承混淆同时继承行为和数据,难以单独复用行为代码复用方式单一且不灵活传统 OOP 框架的通病
测试 / Mock 困难子类紧绑父类实现,单元测试很难 mock 父类行为TDD / 测试覆盖率难以推进Go 社区特别强调这一点
性能 & 内存布局不可预测虚函数表、对象 slicing、多重继承内存布局复杂Rust 尤其在意零成本抽象和可预测性Rust 内存安全 + 性能双目标

一句话总结:继承是“纵向复用”,但它把复用和“类型层次”强绑定在一起,导致耦合度过高、灵活性过低

2. Go 和 Rust 分别用什么机制替代继承(它们其实殊途同归)

语言替代继承的核心机制怎么实现“类似继承”的效果强制/引导程度
Go匿名嵌入(struct embedding) + 接口把一个结构体匿名嵌入另一个结构体 → 自动获得其方法(委托)
接口实现“鸭子类型”多态
非常强(根本没类和继承语法)
RustTrait + 泛型 + 组合(struct 嵌套)用 Trait 定义行为
用泛型 / impl 为具体类型实现 Trait
数据直接组合(has-a)
极强(连 class 关键字都没有)

两者共同点:

  • 行为复用→ 通过接口 / trait(横向的、松耦合的)
  • 数据复用→ 通过组合(把需要的字段直接嵌进去)
  • 不存在“父类引用指向子类对象”的隐式向上转型(Go 接口值、Rust dyn Trait 才有动态分发)

3. 设计者公开表达过的核心动机(提炼版)

  • Go(Rob Pike 等)
    “我们观察到,大型面向对象系统中,继承链越长,维护成本越高。我们想要简单、可预测、可组合的语言。接口 + 嵌入已经足够表达绝大多数需求,而且更清晰。”

  • Rust(Graydon Hoare 等早期设计者)
    “继承与 Rust 的内存模型、安全模型、零成本抽象目标严重冲突。虚函数表 + 对象布局继承会破坏所有权、生命周期、Send/Sync 等安全保证。组合 + trait 能达到甚至超过继承的表达力,同时保持可预测的性能和安全性。”

4. 一个极简对比表(实际使用感受)

你想实现的效果用继承(Java/C#风格)怎么写用 Go 风格写用 Rust 风格写谁更清晰/灵活?
“汽车是交通工具”class Car extends Vehicletype Car struct { Vehicle }struct Car { vehicle: Vehicle }Go/Rust 更明确是 has-a
添加“可飞行”能力class FlyingCar extends Car implements Flyable再嵌入 Flyable struct 或实现 Flyable 接口impl Flyable for Car { … }Trait 胜出
替换引擎实现(mock 测试)很难(紧耦合父类)很容易(组合可以换掉字段)很容易(依赖注入 + trait object)组合完胜

小结

Go 和 Rust 舍弃继承,不是因为它们“不支持面向对象”,而是因为它们认为传统的类继承是一种过时的、弊大于利的代码复用方式

它们用更松耦合、更可组合、更可测试的机制(接口/trait + 组合)来取代继承,在实际大型项目中表现出了更高的长期可维护性和更低的意外复杂度。这也是为什么“组合优于继承”这句话从 90 年代的建议,变成了 2020 年代很多现代语言的强制设计选择

你现在写代码时,是更倾向于用继承,还是已经习惯组合 + 接口/trait 的写法了?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 21:33:58

2026年1月重大漏洞威胁情报与分析

2026年1月更新 我们是威胁情报部门,由全球威胁研究人员和数据科学家团队组成,结合数据分析和机器学习(ML)领域的专有技术,分析着世界上规模最大、最多样化的威胁数据集合之一。研究团队提供战术威胁情报,为…

作者头像 李华
网站建设 2026/3/31 8:25:30

3大维度解析GHelper:华硕笔记本性能管理的轻量级革命

3大维度解析GHelper:华硕笔记本性能管理的轻量级革命 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址…

作者头像 李华
网站建设 2026/4/11 22:34:54

无人机落水钓鱼检测数据集 无人机钓鱼及溺水检测数据集 无人机河道两边钓鱼检测数据集 水边安全监测领域,通过该数据集训练的 AI 模型,可自动识别水边区域的钓鱼行为、溺水风险及船只目标,帮助相关管理部门

无人机落水钓鱼数据集 README 数据集核心信息表 信息类别详细说明类别数量及名称4 类,分别为钓鱼伞(DiaoYuSan)、水边钓鱼(ShuiBianDiaoYu)、游泳溺水(YouYongNiShui)、船只(boat&am…

作者头像 李华
网站建设 2026/4/1 23:16:43

5分钟上手GPEN图像修复,科哥版WebUI一键增强老照片

5分钟上手GPEN图像修复,科哥版WebUI一键增强老照片 你是不是也翻出过泛黄的老相册?那张被岁月模糊了轮廓的全家福、那张边角卷曲却笑容灿烂的毕业照、还有那张因保存不当而布满噪点的童年合影……它们承载着真实的情感,却困在低画质里。现在…

作者头像 李华
网站建设 2026/4/12 0:32:03

打造智能协作机械臂:LeRobot SO-101从硬件到控制全攻略

打造智能协作机械臂:LeRobot SO-101从硬件到控制全攻略 【免费下载链接】lerobot 🤗 LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot LeRobot SO-10…

作者头像 李华
网站建设 2026/4/13 23:26:25

模拟电子技术基础核心要点:运算放大器初步认识

以下是对您提供的博文《模拟电子技术基础核心要点:运算放大器初步认识》的 深度润色与重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI腔调与模板化表达(如“本文将从……几个方面阐述”) ✅ 摒弃刻板章节标题&#…

作者头像 李华