这是我参与更文挑战的第 15 天,活动详情查看: 更文挑战
前文回顾
前面的文章主要介绍了 Go 语言中匿名函数和闭包。Go 的匿名函数是一个闭包。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通过嵌套创造出新的接口。
本文将会继续介绍接口的声明和嵌套。
接口声明和嵌套
接口是调用方和实现方约定的一种合作协议。调用者不关心接口的实现方式,而实现者通过接口暴露自己的内在功能。每个接口由一个或者多个方法组成,其样式如下所示:
type interfaceName interface {
method1(params)(return params)
method2(params)(return params)
method3(params)(return params)
...
}
复制代码
定义接口需要配合使用 type
和 interface
关键字。当接口名的首字母和方法名的首字母皆为大写时,表示该方法是公开的,它可以被接口所在包以外的地方被访问,关于包的相关概念我们将在后面的章节介绍。
我们可以定义一个坦克的接口,它可以运走,也可以开炮,如下所示:
type Tank interface {
Walk() // 运走
Fire() // 开炮
}
复制代码
除了坦克,我们还有飞机,飞机的功能比较简单,仅仅能够飞行,如下所示:
type Plane interface {
Fly() // 飞行
}
复制代码
假如我们现在了一种新型武器,它既可以像坦克一样运走和开炮,也可以像飞机一样飞行,那我们可以使用 Golang 的接口嵌套的特性,将 Tank
和 Plane
接口进行嵌套创造出新的接口,如下代码所示:
type PlaneTank interface {
Tank
Plane
}
复制代码
PlaneTank
嵌套了 Tank
和 Plane
接口,它的实现者就同时具备坦克和飞机的功能。通过 Golang 的接口嵌套特性,可以实现类似面向对象中的接口继承特性,从而创造出新的接口。
小结
本文主要介绍了接口声明和嵌套的定义与示例使用。在 Go 语言中,接口的嵌套组合使得一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。只要接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用。
与 C 语言类似,Golang 提供结构体类型。结构体作为一种复合类型,由多个字段组成,每个字段都具备自己的类型和值,结构体和字段可以理解为实体和实体对应的属性。下面的文章,我们将开始介绍结构体相关的定义与使用。