Menu
CoddyTech

实现接口

本课属于 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 接口非常灵活。任何现有类型只要具有所需的方法,就能满足新的接口,即使该接口是在类型编写完成后才创建的。

challenge icon

挑战

简单

在这个挑战中,你将通过创建一个简单的车辆系统来练习实现接口。你将创建一个 Car 结构体,它会通过 Go 的隐式实现自动实现 Vehicle 接口。

你会收到两个输入:

  • 一个表示汽车品牌的字符串(例如 "Toyota")
  • 一个表示汽车速度(单位为 km/h)的字符串(例如 "120")

你的任务是:

  1. 定义一个 Vehicle 接口,其中包含一个方法签名:GetInfo(),该方法返回一个字符串
  2. 定义一个包含两个字段的 Car 结构体:Brand(字符串)和 Speed(整数)
  3. 为 Car 结构体实现 GetInfo() 方法,使其返回指定格式的字符串:"Brand: [brand], Speed: [speed] km/h"
  4. 解析输入,创建一个 Car 实例
  5. 调用 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)
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器