实现接口
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 14 课,共 68 课。
现在你已经知道如何定义接口,接下来我们来学习 Go 类型实际上如何实现接口。最重要的是要理解,Go 使用隐式实现,不需要任何特殊关键字或声明。
如果某个类型拥有接口要求的所有方法,它就会自动满足该接口。你不需要明确声明该类型实现了这个接口,Go 会自动判断。
下面介绍它如何与上一课中的 Shaper 接口配合使用:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}由于 Circle 类型有一个返回 float64 的 Area() 方法,因此它会自动实现 Shaper 接口。无需显式声明这种关系,Go 会根据方法签名匹配来识别。
这种隐式方式让 Go 接口非常灵活。任何现有类型只要具有所需的方法,就能满足新的接口,即使该接口是在类型编写完成后才创建的。
挑战
简单在这个挑战中,你将通过创建一个简单的车辆系统来练习实现接口。你将创建一个 Car 结构体,它会通过 Go 的隐式实现自动实现 Vehicle 接口。
你会收到两个输入:
- 一个表示汽车品牌的字符串(例如
"Toyota") - 一个表示汽车速度(单位为 km/h)的字符串(例如
"120")
你的任务是:
- 定义一个
Vehicle接口,其中包含一个方法签名:GetInfo(),该方法返回一个字符串 - 定义一个包含两个字段的
Car结构体:Brand(字符串)和Speed(整数) - 为
Car结构体实现GetInfo()方法,使其返回指定格式的字符串:"Brand: [brand], Speed: [speed] km/h" - 解析输入,创建一个
Car实例 - 调用
GetInfo()方法并打印结果
请记住,在 Go 中,Car 结构体会自动实现 Vehicle 接口,因为它具有签名正确的必需方法 GetInfo()。无需显式声明 Car 实现了 Vehicle,Go 会隐式识别这种关系。
亲手试试
package main
import (
"fmt"
"strconv"
)
// TODO: 1. 定义 Vehicle 接口,其中包含返回字符串的 GetInfo() 方法
// TODO: 2. 定义 Car 结构体,包含 Brand(string)和 Speed(int)字段
// TODO: 3. 为 Car 实现 GetInfo() 方法
func main() {
// 读取输入
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// 将速度字符串转换为整数
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. 用 brand 和 speed 创建一个 Car 实例,然后调用 GetInfo()
result := "" // 用你的实现替换这一行
_ = brand
_ = speed
// 输出结果
fmt.Println(result)
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器