Go 语言中的面向对象 | 青训营笔记

165 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

之前写了一篇文章概括了 Go 的基本语法,在后面的实践中发现 Go 语言中类似「面向对象」的一部分还非常值得研究,于是再写一篇来研究一下。

简介

Go不像Java和C++这些流行的语言,不是真正的面向对象语言。不过,面向对象这种编程范式更多地概念上融入了支持它的语言的构建中。也就是说,大多数通用语言可能不是面向对象的,但可以模仿面向对象的原则。一种编程语言可能本身对实现面向对象编程的原则有很少或有限的支持。尽管一种纯粹的面向对象语言对面向对象原则更友好,并且明确地支持它的特性,例如继承、多态、封装等。

实践

结构体与类的比较

尽管 Go 在面向对象的支持方面比 Java 差了很多,但可以通过多种办法实现。

  • Go 没有类的概念,但可以在结构体上定义方法,实现数据和行为的封装
  • Go 不支持继承,但可以通过嵌套结构体或接口来实现类似的功能
  • Go 不支持多态,但可以通过接口来实现不同类型的结构体共享相同的方法集
  • Go 的结构体是值类型,可以直接比较,而 Java 的类是引用类型,需要重写 equals 方法来比较

Go 的结构体还有 Java 的类一些没有的功能。

  • Go 的结构体可以有匿名字段,相当于继承了该字段的类型的所有属性和方法
  • Go 的结构体可以使用标签(Tag)来添加元数据信息,例如 JSON 序列化时的字段名

方法与方法的比较

  • Go 的方法是一种特殊的函数,可以定义在任何类型上,不需要属于某个类或对象,而 Java 的方法必须定义在类或对象中。
  • Go 的方法可以通过值接收者或指针接收者来调用,而 Java 的方法只能通过引用来调用。
  • Go 的方法可以通过组合和接口来实现多态和继承,而 Java 的方法可以通过类的继承和重写来实现多态和继承。
  • Go 没有异常机制,而是通过返回错误值来处理错误情况,而 Java 有异常机制,可以通过抛出和捕获异常来处理错误情况。

接口与接口的比较

  • Go 的接口是一种抽象类型,只定义了方法签名,不需要实现,而 Java 的接口是一种契约,需要实现类来实现。
  • Go 的接口是隐式实现的,只要一个类型实现了接口中的所有方法,就可以认为它实现了该接口,而 Java 的接口是显式实现的,需要用 implements 关键字来声明。
  • Go 的接口可以嵌套其他接口,也可以包含零个或多个方法,而 Java 的接口不能嵌套其他接口,只能继承其他接口,并且必须包含至少一个方法。
  • Go 的接口支持多态和动态分派,可以通过类型断言和反射来操作接口值,而 Java 的接口也支持多态和动态分派,但不能直接操作接口值。