Menu
CoddyTech

回顾:形状与行为

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 19 课,共 68 课。

challenge icon

挑战

简单

在这个挑战中,你将创建一个通过接口展示多态性的通信系统。你将构建一个 Speaker 接口,并用不同类型实现它,让它们以各自独特的方式“说话”。

你会收到 3 个输入:

  • 一个表示要创建的说话者数量的字符串(例如,"3")
  • 一个包含说话者类型的字符串,类型之间用逗号分隔(例如,"person,parrot,person")
  • 一个包含说话者姓名的字符串,姓名之间用逗号分隔(例如,"Alice,Polly,Bob")

你的任务是:

  1. 定义一个 Speaker 接口,其中包含一个方法签名:Speak(),该方法返回一个字符串
  2. 定义一个 Person 结构体,其中包含一个 Name 字段(字符串)
  3. 定义一个 Parrot 结构体,其中包含一个 Name 字段(字符串)
  4. 为这两个结构体实现 Speak() 方法:
    • Person 应返回:"Hello, I'm [name]"
    • Parrot 应返回:"Squawk! [name] says hello!"
  5. 创建一个名为 makeAllSpeak 的函数,该函数接收一个由 Speaker 接口组成的切片作为参数
  6. 在 makeAllSpeak 中,遍历切片并对每个说话者调用 Speak() 方法,打印结果
  7. 解析输入,根据提供的类型和姓名创建相应的说话者实例
  8. 将所有说话者存储在一个由 Speaker 接口组成的切片中
  9. 将说话者切片传给 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 在线编译器