Xem tất cả việc cần làm
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 22 trên 68.
Thử thách
DễTiếp tục xây dựng hệ thống quản lý công việc, giờ bạn sẽ triển khai chức năng hiển thị tất cả công việc theo định dạng thân thiện với người dùng. Thử thách này tập trung vào việc duyệt qua danh sách công việc và hiển thị trạng thái hoàn thành của từng công việc bằng các dấu hiệu trực quan rõ ràng.
Bạn sẽ nhận hai đầu vào:
- Một chuỗi (string) biểu thị số lượng công việc (ví dụ:
"4") - Một chuỗi chứa dữ liệu công việc theo định dạng:
"name1:status1,name2:status2,name3:status3", trong đó trạng thái là"true"hoặc"false"(ví dụ:"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")
Nhiệm vụ của bạn:
- Định nghĩa lại struct
Tasknhư trong các thử thách trước, với các trườngName(string) vàCompleted(bool) - Tạo một hàm có tên
viewAllTasks, nhận một slice gồm các structTasklàm tham số - Bên trong hàm
viewAllTasks, duyệt qua slice và in ra từng công việc theo định dạng sau:- Với công việc đã hoàn thành:
"[x] [task_name]" - Với công việc chưa hoàn thành:
"[ ] [task_name]"
- Với công việc đã hoàn thành:
- Phân tích dữ liệu công việc từ đầu vào thứ hai để tạo slice công việc:
- Tách đầu vào theo dấu phẩy để lấy từng mục công việc riêng lẻ
- Với mỗi mục, tách theo dấu hai chấm để phân chia tên và trạng thái
- Chuyển chuỗi trạng thái thành giá trị boolean (
"true"trở thànhtrue,"false"trở thànhfalse)
- Gọi hàm
viewAllTasksvới slice đã tạo - Sau khi hiển thị tất cả công việc, in ra phần tổng kết theo định dạng:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Ví dụ, nếu bạn có các công việc "Buy groceries:false,Call dentist:true,Finish project:false", đầu ra sẽ hiển thị từng công việc với ô đánh dấu phù hợp, sau đó là phần tổng kết với tổng số công việc và thống kê trạng thái hoàn thành. Thử thách này giúp bạn luyện tập cách duyệt slice, định dạng hiển thị theo điều kiện bằng câu lệnh if và trình bày tiến độ công việc một cách rõ ràng cho người dùng.
Tự làm thử
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func viewAllTasks(tasks []Task) {
// TODO: Viết hàm (function) để hiển thị tất cả công việc
// Với công việc đã hoàn thành: "[x] [task_name]"
// Với công việc chưa hoàn thành: "[ ] [task_name]"
}
func main() {
var numTasksStr string
fmt.Scanln(&numTasksStr)
numTasks, _ := strconv.Atoi(numTasksStr)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
taskData := scanner.Text()
var tasks []Task
// TODO: Phân tích dữ liệu công việc từ chuỗi (string) taskData
// Tách theo dấu phẩy để lấy từng mục công việc
taskEntries := strings.Split(taskData, ",")
_ = taskEntries
// Với mỗi mục, tách theo dấu hai chấm để phân biệt tên và trạng thái
// Chuyển chuỗi trạng thái thành giá trị boolean rồi tạo các struct Task
// TODO: Gọi hàm viewAllTasks với slice đã tạo
// TODO: Tính toán và in ra phần tổng kết
// Định dạng: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
_ = tasks
_ = numTasks
}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