news 2026/6/15 22:06:18

为什么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/6/15 13:49:26

当AI拥有“公司架构”:多智能体如何玩转商业决策?

让AI化身部门主管,在虚拟会议室中为真实商业决策激烈交锋,这家“AI公司”展示的智慧远超想象。 深夜十二点,某电商公司供应链负责人正盯着不断攀升的库存数据和波动的需求预测发愁。传统的单AI系统给出的优化建议总是顾此失彼——库存优化方案会牺牲交付速度,而追求交付速度…

作者头像 李华
网站建设 2026/6/15 17:34:26

Web3D交通可视化从零开始:SUMO-Web3D完全指南

Web3D交通可视化从零开始:SUMO-Web3D完全指南 【免费下载链接】sumo-web3d Web-based 3D visualization of SUMO microsimulations using TraCI and three.js. 项目地址: https://gitcode.com/gh_mirrors/su/sumo-web3d 作为一款基于SUMO(Simulat…

作者头像 李华
网站建设 2026/6/14 16:29:12

教育资源下载全攻略:从合规获取到高效管理

教育资源下载全攻略:从合规获取到高效管理 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 教育资源获取的核心挑战与合规框架 在数字化学习普及的今天…

作者头像 李华
网站建设 2026/6/15 16:07:42

音频格式转换高效解决方案:NCM文件解密与跨平台应用指南

音频格式转换高效解决方案:NCM文件解密与跨平台应用指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐生态中,平台专有格式限制已成为内容自由流转的主要障碍。网易云音乐采用的NCM加密格式虽能有…

作者头像 李华
网站建设 2026/6/15 12:39:34

WinSetView:实现Windows文件夹视图统一的高效工具

WinSetView:实现Windows文件夹视图统一的高效工具 【免费下载链接】WinSetView Globally Set Explorer Folder Views 项目地址: https://gitcode.com/gh_mirrors/wi/WinSetView 在日常Windows文件管理中,你是否经常遇到文件夹视图设置混乱的问题&…

作者头像 李华
网站建设 2026/6/15 20:34:38

VirtualLab Fusion应用:Herriott池的建模与仿真

摘要在气体光谱学中,为了获得足够灵敏的吸收测量,通常要求具有较长的光程长度。充气体积包裹在反射镜之间的多通道单元是满足这一要求的一种方式,同时在途中控制光束发散,避免了对超大设备的需求。Herriott单元是这种系统的一个例…

作者头像 李华