文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go 为什么不支持类和继承?

2024-12-02 13:41

关注

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼。转载本文请联系脑子进煎鱼了公众号。

大家好,我是煎鱼。

大家在早期学习 Go 时,一旦跨过语法的阶段后。马上就会进入到一个新的纠结点,Go 不支持面向对象吗?

这门编程语言里没有类(class)、继承(extends),没法一把搜了,面试问啥面向对象(OOP)?

今天煎鱼就带大家一起来了解这之中的思考,Go 真的不支持吗?

类和继承

类是什么

类(class)在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的特性和方法(via @维基百科)。

例子如下:

  1. class SimpleClass 
  2.     // 声明属性 
  3.     public $var = '脑子进煎鱼了'
  4.  
  5.     // 声明方法 
  6.     public function displayVar() { 
  7.         echo $this->var; 
  8.     } 

每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。

继承是什么

继承是面向对象软件技术当中的一个概念,如果一个类别 B “继承自”另一个类别 A,就把这个 B 称为 “A的子类”,而把 A 称为 “B的父类别” 也可以称 “A 是 B 的超类”(via @维基百科)。

例子如下:

  1. // 父类 
  2. class Foo 
  3.     public function printItem($string) 
  4.     { 
  5.         echo '煎鱼1: ' . $string . PHP_EOL; 
  6.     } 
  7.      
  8.     public function printPHP() 
  9.     { 
  10.         echo 'PHP is great.' . PHP_EOL; 
  11.     } 
  12.  
  13. // 子类 
  14. class Bar extends Foo 
  15.     public function printItem($string) 
  16.     { 
  17.         echo '煎鱼2: ' . $string . PHP_EOL; 
  18.     } 

继承有如下两个特性:

结构和组合

在 Go 里就比较 ”特别“ 了,因为没有传统的类,也没有继承。

取而代之的是结构和组合的方式。这也是业内对 Go 是否 OOP 争议最大的地方。

结构体

我们可以在 Go 中通过结构体的方式来组织代码,达到类似类的方式。

例子如下:

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. type person struct { 
  6.     name string 
  7.     age  int 
  8.  
  9. func(p *person) hello(){} 
  10.  
  11. func newPerson(name string) *person { 
  12.     p := person{namename
  13.     p.age = 42 
  14.     return &p 
  15.  
  16. func main() { 
  17.     fmt.Println(person{"煎鱼1", 22}) 
  18.     fmt.Println(person{name"煎鱼2", age: 33}) 
  19.     ... 

在上述代码中,我们可以定义结构体内的属性,也可以针对结构体这些类型定义只属于他们的方法。

在声明实例上,可以配合 newXXX 的初始化方法来生成,这是 Go 里约定俗成的方式。

组合

类的声明采取结构体的方式取代后,也可以配套使用 ”组合“ 来达到类似继承的效果。

例子如下:

  1. type man struct { 
  2.  name string 
  3.  
  4. func (m *man) hello1() {} 
  5.  
  6. type person struct { 
  7.  man 
  8.  name string 
  9.  
  10. func (p *person) hello2() {} 
  11.  
  12. func newPerson(name string) *person { 
  13.  p := person{namename
  14.  return &p 
  15.  
  16. func main() { 
  17.  p := newPerson("脑子进煎鱼了"
  18.  p.hello1() 

在上述代码中,我们分别定义了 man 和 person 两个结构体,并将 man 嵌入到 person 中,形成组合。

你可以在 main 方法中能够看到,person 实例是可以使用和调用 man 实例的一些公开属性和方法的。

在简单的使用效果上会与继承有些接近。

Go 是面向对象的语言吗

“Go 语言是否一门面向对象的语言?”,这是一个日经话题。官方 FAQ 给出的答复是:

是的,也不是。原因是:

为什么不支持类和继承

有的人认为类和继承是面向对象的必要特性,必须要有,才能是面向对象的语言,但其实也并非如此。

面向对象(OOP)有不同的含义和解读,许多概念也可以通过结构体、组合和接口等方式进行表达,说是不支持传统的 OOP。

其实真相是 Go 是选择了另外一条路,也就是 ”组合优于继承“。我们所提到的类和继承并不是定义 OOP 的一种准则,只是协助完成 OOP 的方法之一。

不要本末倒置了,不让工具来定义 OOP 的理念。

总结

在今天这篇文章中,我们介绍了常说的类和继承的业内定义和使用案例。同时面向 Go 读者群里的疑惑,进行了解答。

实质上,Go 是 OOP,也不是 OOP。类和继承只是实现 OOP 的一种方式,但并不是没有这两者,他就不是 OOP 了。

 

不支持的原因也很明确,Go 在设计上,选择了组合优于继承的编程设计模式,它不是传统那种面向类型的范式。

 

来源:脑子进煎鱼了内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯