Kết hợp tất cả
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 25 trên 68.
Thử thách
DễĐã đến lúc hoàn thiện ứng dụng danh sách nhiệm vụ. Ở bước cuối cùng này, bạn kết hợp mọi thứ từ các bài học trước: struct Task, addTask, viewAllTasks, completeTask và removeTask, điều khiển chúng bằng một phiên thao tác trên menu.
Bạn sẽ nhận ba đầu vào:
- Một chuỗi chứa tên ứng dụng và tên người dùng, được phân cách bằng dấu phẩy (ví dụ:
"MyTasks,Alice") - Một chuỗi chứa các nhiệm vụ có sẵn trong danh sách lúc bắt đầu, theo định dạng
"name1:status1,name2:status2", trong đó trạng thái là"true"hoặc"false"(ví dụ:"Write report:false,Call dentist:true"). Dòng này để trống nếu danh sách ban đầu không có nhiệm vụ nào. - Một chuỗi chứa các thao tác trong phiên, được phân cách bằng dấu phẩy. Thao tác có thể chỉ gồm tên thao tác hoặc tên thao tác kèm một tham số, được nối bằng
|(ví dụ:"add|Buy groceries,view,complete|2,remove|0,exit"). Danh sách thao tác luôn kết thúc bằng"exit".
Tên nhiệm vụ có chứa khoảng trắng, vì vậy hãy đọc cả ba dòng bằng bufio.Scanner, như trong các bài học trước.
Nhiệm vụ của bạn là:
- Định nghĩa struct
Tasknhư trước, với các trườngName(string) vàCompleted(bool) - Viết lại bốn hàm bạn đã tạo, giữ nguyên chữ ký hàm:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), hàm này in ra"[x] [task_name]"cho nhiệm vụ đã hoàn thành và"[ ] [task_name]"cho nhiệm vụ vẫn còn đang mởcompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- Tạo danh sách ban đầu từ đầu vào thứ hai, lưu ý rằng dòng trống có nghĩa là danh sách không có phần tử nào
- In thông báo chào mừng và menu, chính xác như ở bước đầu tiên của dự án:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- Chạy các thao tác theo thứ tự. Mỗi thao tác cần in tiêu đề trước:
"add": in"--- ADD TASK ---", thêm nhiệm vụ có tên được chỉ định bằng tham số, rồi in"Task '[task_name]' added!""view": in"--- VIEW TASKS ---", liệt kê mọi nhiệm vụ bằngviewAllTasks, rồi in dòng tổng kết"complete": in"--- COMPLETE TASK ---", đánh dấu nhiệm vụ tại chỉ số đó là đã hoàn thành, rồi in"Task '[task_name]' marked as completed!""remove": in"--- REMOVE TASK ---", xóa nhiệm vụ tại chỉ số đó, rồi in"Task '[task_name]' removed successfully!""exit": in"--- EXIT ---", rồi in"Final list:", sau đó in toàn bộ danh sách, tiếp theo là dòng tổng kết và cuối cùng là"Goodbye, [user_name]!". Không chạy gì sau khi thoát.
- Chỉ số bắt đầu từ 0, như trong các bài học trước. Khi chỉ số của thao tác
"complete"hoặc"remove"nằm ngoài phạm vi danh sách, hãy in"Invalid task number"thay vào đó và giữ nguyên danh sách. - Dòng tổng kết là dòng bạn đã biết:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Dùng package strings để tách các dòng đầu vào và package strconv để chuyển chỉ số thành số. Bước cuối cùng này cho thấy các hàm nhỏ bạn viết lần lượt có thể kết hợp thành một chương trình hoạt động như thế nào.
Tự làm thử
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Đưa lại addTask, viewAllTasks, completeTask và removeTask
// từ các bài học trước của dự án này
func main() {
// Tạo scanner để đọc các dòng đầu vào
scanner := bufio.NewScanner(os.Stdin)
// Đọc tên ứng dụng và tên người dùng
scanner.Scan()
names := scanner.Text()
// Đọc các tác vụ có sẵn trong danh sách ban đầu
scanner.Scan()
taskData := scanner.Text()
// Đọc các thao tác trong phiên làm việc
scanner.Scan()
actionData := scanner.Text()
// TODO: Hoàn thiện phần triển khai
// 1. Tách names theo "," để lấy tên ứng dụng và tên người dùng
// 2. Tạo slice tác vụ ban đầu từ taskData
// 3. In ra lời chào, menu và số tác vụ hiện tại
// 4. Chạy lần lượt từng thao tác trong actionData, in tiêu đề của thao tác đó trước
}
Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online