整合所有内容
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 25 课,共 68 课。
挑战
简单现在来完成你的任务列表应用。在最后这一步中,你要把前几课学到的内容结合起来:Task 结构体、addTask、viewAllTasks、completeTask 和 removeTask,并通过一系列菜单操作来调用它们。
你会收到 3 个输入:
- 一个字符串,包含应用名称和用户名,两者之间用逗号分隔(例如,
"MyTasks,Alice") - 一个字符串,包含列表初始任务,格式为
"name1:status1,name2:status2",其中状态是"true"或"false"(例如,"Write report:false,Call dentist:true")。如果列表初始为空,这一行就是空的。 - 一个字符串,包含本次会话的操作,各项之间用逗号分隔。操作可以只有名称,也可以由名称和一个参数组成,两者之间用
|连接(例如,"add|Buy groceries,view,complete|2,remove|0,exit")。操作列表始终以"exit"结尾。
任务名称中可能包含空格,因此要像前几课那样,使用 bufio.Scanner 读取全部 3 行。
你需要完成以下任务:
- 定义相同的
Task结构体,包含Name(string)和Completed(bool)字段 - 重新加入你已经编写过的 4 个函数,签名保持不变:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task),已完成的任务打印为"[x] [task_name]",仍未完成的任务打印为"[ ] [task_name]"completeTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- 根据第二个输入创建初始列表,记住空行表示空列表
- 打印欢迎消息和菜单,内容与项目第一步完全相同:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- 按顺序执行各项操作。每项操作都要先打印对应的标题:
"add":打印"--- ADD TASK ---",添加参数指定的任务,然后打印"Task '[task_name]' added!""view":打印"--- VIEW TASKS ---",使用viewAllTasks列出所有任务,然后打印汇总行"complete":打印"--- COMPLETE TASK ---",将指定索引的任务标记为已完成,然后打印"Task '[task_name]' marked as completed!""remove":打印"--- REMOVE TASK ---",移除指定索引的任务,然后打印"Task '[task_name]' removed successfully!""exit":打印"--- EXIT ---",然后打印"Final list:",接着打印整个列表和汇总行,最后打印"Goodbye, [user_name]!"。退出后不再执行任何操作。
- 和前几课一样,索引从 0 开始。如果
"complete"或"remove"的索引超出列表范围,就改为打印"Invalid task number",并保持列表不变。 - 汇总行与你之前学过的一样:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
使用 strings 包拆分输入行,并使用 strconv 包将索引转换为数字。最后这一步会展示你逐个编写的小函数如何组合成一个可运行的程序。
亲手试试
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO:恢复 addTask、viewAllTasks、completeTask 和 removeTask
// 这些函数来自本项目前面的课
func main() {
// 创建 scanner,用于读取输入行
scanner := bufio.NewScanner(os.Stdin)
// 读取应用名称和用户名
scanner.Scan()
names := scanner.Text()
// 读取列表中的初始任务
scanner.Scan()
taskData := scanner.Text()
// 读取本次会话中的操作
scanner.Scan()
actionData := scanner.Text()
// TODO:完成实现
// 1. 按 "," 拆分 names,获取应用名称和用户名
// 2. 根据 taskData 构建初始任务切片
// 3. 输出欢迎消息、菜单和当前任务数量
// 4. 按顺序执行 actionData 中的每个操作,先输出对应的标题
}
逻辑与流程中的所有课
自己练习: Go 在线编译器