回顾:形状与行为
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 19 课,共 68 课。
挑战
简单在这个挑战中,你将创建一个通过接口展示多态性的通信系统。你将构建一个 Speaker 接口,并用不同类型实现它,让它们以各自独特的方式“说话”。
你会收到 3 个输入:
- 一个表示要创建的说话者数量的字符串(例如,
"3") - 一个包含说话者类型的字符串,类型之间用逗号分隔(例如,
"person,parrot,person") - 一个包含说话者姓名的字符串,姓名之间用逗号分隔(例如,
"Alice,Polly,Bob")
你的任务是:
- 定义一个
Speaker接口,其中包含一个方法签名:Speak(),该方法返回一个字符串 - 定义一个
Person结构体,其中包含一个Name字段(字符串) - 定义一个
Parrot结构体,其中包含一个Name字段(字符串) - 为这两个结构体实现
Speak()方法:Person应返回:"Hello, I'm [name]"Parrot应返回:"Squawk! [name] says hello!"
- 创建一个名为
makeAllSpeak的函数,该函数接收一个由Speaker接口组成的切片作为参数 - 在
makeAllSpeak中,遍历切片并对每个说话者调用Speak()方法,打印结果 - 解析输入,根据提供的类型和姓名创建相应的说话者实例
- 将所有说话者存储在一个由
Speaker接口组成的切片中 - 将说话者切片传给
makeAllSpeak并调用它
说话者应按照它们在输入中出现的顺序创建。例如,如果类型是 "person,parrot,person",姓名是 "Alice,Polly,Bob",就依次创建名为 Alice 的 Person、名为 Polly 的 Parrot,然后是名为 Bob 的 Person。这个挑战展示了不同类型如何通过共享接口被统一处理,体现了多态性在 Go 中的强大之处。
亲手试试
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 读取输入
var numSpeakersStr string
var speakerTypesStr string
var speakerNamesStr string
fmt.Scanln(&numSpeakersStr)
fmt.Scanln(&speakerTypesStr)
fmt.Scanln(&speakerNamesStr)
// 解析输入
numSpeakers, _ := strconv.Atoi(numSpeakersStr)
speakerTypes := strings.Split(speakerTypesStr, ",")
speakerNames := strings.Split(speakerNamesStr, ",")
// TODO: 在下方编写你的代码
// 1. 定义 Speaker 接口
// 2. 定义 Person 和 Parrot 结构体
// 3. 为这两个结构体实现 Speak() 方法
// 4. 创建 makeAllSpeak 函数
// 5. 根据输入创建 speakers,并存入切片
// 6. 用你的切片调用 makeAllSpeak
}逻辑与流程中的所有课
自己练习: Go 在线编译器