本文转载自微信公众号「脑子进煎鱼了」,不支作者陈煎鱼。持类承转载本文请联系脑子进煎鱼了公众号。和继 大家好,不支我是持类承煎鱼。 大家在早期学习 Go 时,和继一旦跨过语法的不支阶段后。马上就会进入到一个新的持类承纠结点,Go 不支持面向对象吗?和继 这门编程语言里没有类(class)、继承(extends),不支没法一把搜了,持类承面试问啥面向对象(OOP)?和继 今天煎鱼就带大家一起来了解这之中的思考,Go 真的不支不支持吗? 类(class)在面向对象编程中是一种面向对象计算机编程语言的构造,是持类承创建对象的蓝图,描述了所创建的和继对象共同的特性和方法(via @维基百科)。 例子如下: 每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。站群服务器 继承是面向对象软件技术当中的一个概念,如果一个类别 B “继承自”另一个类别 A,就把这个 B 称为 “A的子类”,而把 A 称为 “B的父类别” 也可以称 “A 是 B 的超类”(via @维基百科)。 例子如下: 继承有如下两个特性: 在 Go 里就比较 ”特别“ 了,因为没有传统的类,也没有继承。 取而代之的是结构和组合的方式。这也是业内对 Go 是否 OOP 争议最大的地方。 我们可以在 Go 中通过结构体的源码库方式来组织代码,达到类似类的方式。 例子如下: 在上述代码中,我们可以定义结构体内的属性,也可以针对结构体这些类型定义只属于他们的方法。 在声明实例上,可以配合 newXXX 的初始化方法来生成,这是 Go 里约定俗成的方式。 类的声明采取结构体的方式取代后,也可以配套使用 ”组合“ 来达到类似继承的效果。 例子如下: 在上述代码中,我们分别定义了 man 和 person 两个结构体,并将 man 嵌入到 person 中,形成组合。 你可以在 main 方法中能够看到,person 实例是可以使用和调用 man 实例的一些公开属性和方法的。 在简单的使用效果上会与继承有些接近。 “Go 语言是服务器托管否一门面向对象的语言?”,这是一个日经话题。官方 FAQ 给出的答复是: 是的,也不是。原因是: 有的人认为类和继承是面向对象的必要特性,必须要有,才能是面向对象的语言,但其实也并非如此。 面向对象(OOP)有不同的含义和解读,许多概念也可以通过结构体、组合和接口等方式进行表达,说是不支持传统的 OOP。 其实真相是 Go 是选择了另外一条路,也就是 ”组合优于继承“。我们所提到的类和继承并不是定义 OOP 的一种准则,只是协助完成 OOP 的方法之一。 不要本末倒置了,不让工具来定义 OOP 的理念。 在今天这篇文章中,我们介绍了常说的类和继承的业内定义和使用案例。同时面向 Go 读者群里的疑惑,进行了解答。 实质上,Go 是 OOP,也不是 OOP。类和继承只是实现 OOP 的一种方式,但并不是没有这两者,他就不是 OOP 了。 不支持的原因也很明确,Go 在设计上,选择了组合优于继承的编程设计模式,它不是传统那种面向类型的范式。类和继承
类是什么
继承是什么
结构和组合
结构体
组合
Go 是面向对象的语言吗
为什么不支持类和继承
总结