定义接口
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 13 课,共 68 课。
现在你已经从概念上理解了接口,接下来我们来学习如何在 Go 中实际定义接口。接口使用 interface 关键字定义,后面跟着一组用花括号括起来的方法签名。
下面是定义接口的基本语法:
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}请注意,接口只包含方法签名,即方法名、参数和返回类型,但不包含实现。接口不会规定这些方法应该如何工作,只规定必须有哪些方法。
例如,你可以这样定义一个简单的 Shaper 接口,要求任何实现它的类型都必须有一个 Area 方法:
type Shaper interface {
Area() float64
}这个接口定义了一项约定:任何想要被视为 Shaper 的类型,都必须有一个不带参数并返回 float64 的 Area 方法。接口不关心类型是什么,也不关心它如何计算面积,只关心是否存在一个签名正确的方法。
挑战
简单在这个挑战中,你将通过创建一个简单的媒体播放器系统,练习在 Go 中定义接口。你将定义一个接口,为不同类型的媒体设备规定一套契约。
你会收到一个输入:
- 一个表示媒体操作的字符串(例如,
"play"、"pause"或"stop")
你的任务是:
- 定义一个名为
MediaPlayer的接口,其中包含三个方法签名:Play(),返回一个字符串Pause(),返回一个字符串Stop(),返回一个字符串
- 根据输入的操作,按照以下格式打印
MediaPlayer接口中相应的方法签名:"MediaPlayer interface requires: [MethodName]() string"
这个程序目前还没有使用 MediaPlayer,这没问题:即使没有任何类型实现接口,Go 也能编译该接口。打印语句只会报告对于给定操作,接口要求的方法签名。在下一课中,你将创建一个实现 MediaPlayer 的类型,并调用它的方法。
方法名的首字母应大写(表示导出),因为它们是接口定义的一部分。输入为 "play" 时,打印 "MediaPlayer interface requires: Play() string";输入为 "pause" 时,打印 "MediaPlayer interface requires: Pause() string";输入为 "stop" 时,打印 "MediaPlayer interface requires: Stop() string"。
这个挑战重点讲解用方法签名定义接口这一基本概念,并确立任何实现该接口的类型都必须遵守的契约。
亲手试试
package main
import "fmt"
func main() {
// 读取输入
var action string
fmt.Scanln(&action)
// TODO:在这里定义你的 MediaPlayer 接口
// TODO:在下方编写代码,处理 action 并打印所需的输出
// 打印结果
// 记得按以下格式打印:"MediaPlayer interface requires: [MethodName]() string"
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器