GO 的接口设计

2022/12/31 Design GO 共 1001 字,约 3 分钟

GO 的接口设计

前言

前些天写了点 GO,写的时候突然在实际的例子中顿悟到了 GO 接口设计的妙处,又仔细思考了下,心中激荡不已,于是写了这篇文章分享一下。如有疏漏错误恳请指正。

接口

首先接口是一种抽象。

  • 接口应该隐藏实现的细节。
  • 有接口就可以有多态。

其次,接口是一种声明,一种约定。

  • 是调用方与实现方的约定,是调用方的要求声明,是实现方的功能声明。

GO 与其他语言接口的区别

GO 实现接口不需要显式声明,一个结构体,只需要实现了接口中所有的方法,就认为这个结构体实现了这个接口。

而一些其他语言,如 Java,C++ ,它们的类需要显式声明自己实现了什么接口,并同时实现接口中的所有方法。

其他语言的接口

基本就是指 Java 和 C++。

接口,以及通过显式声明自己实现此接口的

他们的接口的实现与应用,是与 OOP 强相关的,是 OOP 思想的一种体现。

  • 实现接口需要显式声明,同时也意味着实现接口的类是后于接口出现的,同时也只实现了自己实现的接口
  • 实现接口的是类,同时也意味着抽象与多态是从类这个层次展开的。

GO 的接口

接口,以及有所有这个接口的方法的结构体

接口的实现并不是通过声明,而是通过是否实现了某些特定的方法来判断。

  • 结构体可能在无意中实现了后来会出现的接口。
  • 抽象需要从方法开始考虑,方法签名需要良好的表现出自己的意图。

GO 设计的可能影响

GO 无需特意考虑自己需要实现什么,只要用准确的,能概括自己功能的方法,描述结构体,就自然而然的实现了自己需要的接口。同时,如果未来有新的接口,只需要已经实现的方法,就实现了新的接口,这样接口就在实现之后了。

因此,GO 的设计需要聚焦于方法,让方法的职责,能力与签名强关联,自然就是良好的设计。

同时,GO 的设计,让不同环境之间的标准有了充分的流动与交互的可能,设计不再那么内向的,集中的,可以扩充与互相使用。这在其他语言中几乎是不能想象的。

举个例子,现在 GO 有一个猫相关的结构体,一个狗相关的结构体,如果他们都实现了吃这个接口,猫用 吃接口 可以吃鱼,狗用 吃接口 可以吃骨头,那么在他们互相不知道对方存在的情况下,我们就可以同时使用他们,让猫吃骨头,狗吃鱼。神奇!

其他语言的接口设计是围绕接口自身展开的,使用者只能去实现接口,接口也只需要维护自己的抽象和自己的扩展,这样自然是趋向封闭的。而 GO 这样的设计,在一定程度上更是促进,或者说逼迫了标准的融合与交流,这和 gofmt 也有相似的设计哲学。

GO,真的很强大!

文档信息

Search

    Table of Contents