接口
接口的本质是引入一个新的中间层,调用方可以通过接口与具体实现分离,解除上下游的耦合,上层的模块不再需要依赖下层的具体模块,只需要依赖一个约定好的接口。
除了解耦有依赖关系的上下游,接口还能够帮助我们隐藏底层实现,减少关注点。
人能够同时处理的信息非常有限,定义良好的接口能够隔离底层的实现,让我们将重点放在当前的代码片段中。SQL 就是接口的一个例子,当我们使用 SQL 语句查询数据时,其实不需要关心底层数据库的具体实现,我们只在乎 SQL 返回的结果是否符合预期。
Go语言中的接口(interface)是一种抽象的类型,它定义了一组方法的签名,但不包含这些方法的具体实现。是duck-type programming的一种体现。
Go 语言中接口的实现都是隐式的,在 Go 中:实现接口的所有方法就隐式地实现了接口;
具体类型(字符串、切片、结构体等)更注重“我是谁”,接口类型更注重“我能做什么”的问题。接口类型就像是一种约定——概括了一种类型应该具备哪些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。
# 接口的优势
使用接口在编程中有很多好处,尤其是在Go语言中,接口提供了以下几个主要优势:
- 抽象与封装 :
- 抽象 :接口允许你定义行为而不需要关心实现细节。这使得代码更具可读性和可维护性,因为你可以关注于“做什么”,而不是“怎么做”。
- 封装 :通过接口,具体的实现可以被隐藏,用户只需要知道如何使用接口,而不需要了解底层的实现逻辑。
- 多态 :
- 接口提供了多态性,你可以使用同一个接口引用不同类型的对象,只要这些对象实现了该接口的方法。这样,函数或方法可以接受不同的具体类型,但行为一致。
- 依赖倒置原则 :
- 接口允许高层模块依赖于抽象,而不是具体实现。这减少了代码之间的耦合,使得模块更容易替换或测试。
- 测试 :
- 接口使得单元测试更加简单。你可以创建模拟对象(mocks)来测试依赖于接口的代码,而不需要真实的实现。
- 代码复用、类型安全、灵活性、简化API设计、促进松耦合......
# 接口类型
接口是一种由程序员来定义的类型,一个接口类型就是一组方法的集合,它规定了需要实现的所有方法。
# 接口的定义
每个接口类型由任意个方法签名组成,接口的定义格式如下:
type 接口类型名 interface {
方法名1(参数列表1)返回值列表1
方法名2(参数列表2)返回值列表2
...
}
1
2
3
4
5
2
3
4
5
其中:
- 接口类型名:Go语言的接口在命名时,一般会在单词后面添加
er
,如有写操作的接口叫Writer
,有关闭操作的接口叫closer
等。接口名最好要能突出该接口的类型含义。 - 方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
- 参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
# 实现接口的条件
接口就是规定了一个需要实现的方法列表,在 Go 语言中一个类型只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口。
... 未完待续
上次更新: 2025/01/07, 14:41:11