Xóa một 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 24 trên 68.
Thử thách
DễTrong phần này của hệ thống quản lý công việc, bạn sẽ triển khai khả năng xóa công việc khỏi danh sách. Thử thách này tập trung vào thao tác với lát cắt (slice) bằng cách dùng hàm append để tạo lại một lát cắt không có phần tử cụ thể, qua đó minh họa cách xóa vĩnh viễn các mục khỏi cấu trúc dữ liệu.
Bạn sẽ nhận ba đầu vào:
- Một chuỗi 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" - Một chuỗi biểu thị chỉ số của công việc cần xóa, ví dụ:
"1"để chọn công việc thứ hai, sử dụng chỉ số bắt đầu từ 0
Nhiệm vụ của bạn là:
- Định nghĩa lại struct
Taskgiống như trong các thử thách trước, với các trườngName(string) vàCompleted(bool) - Tạo hàm có tên
removeTasknhận một lát cắt các structTaskvà một chỉ số (int) làm tham số - Bên trong hàm
removeTask, trả về một lát cắt mới đã xóa công việc ở chỉ số đã cho bằng cách dùngappendđể kết hợp các phần tử trước và sau chỉ số đó - Phân tích dữ liệu công việc từ đầu vào thứ hai để tạo lát cắt công việc:
- Tách đầu vào theo dấu phẩy để lấy từng mục công việc
- 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 (
"true"trở thànhtrue,"false"trở thànhfalse)
- Chuyển chuỗi đầu vào thứ ba thành số nguyên để lấy chỉ số công việc
- Lưu tên của công việc cần xóa trước khi gọi hàm
removeTask - Gọi hàm
removeTaskvới lát cắt và chỉ số, rồi lưu lát cắt được trả về - Sau khi xóa công việc, hiển thị tất cả công việc còn lại theo cùng định dạng như trong các thử thách trướ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]"
- Với công việc đã hoàn thành:
- In thông báo xác nhận:
"Task '[task_name]' removed successfully!" - In bản tổng kết đã cập nhật:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Dùng package strconv để chuyển chuỗi chỉ số thành số nguyên. Thử thách này minh họa cách dùng append để tạo lại lát cắt bằng cách kết hợp các phần trước và sau phần tử mục tiêu, qua đó xóa các mục khỏi tập hợp mà vẫn giữ nguyên thứ tự của những phần tử còn lại.
Tự làm thử
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func completeTask(tasks *[]Task, index int) {
(*tasks)[index].Completed = true
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskDataStr := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskDataStr, ",")
tasks := make([]Task, len(taskEntries))
for i, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks[i] = Task{Name: name, Completed: status}
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Complete the task
taskName := tasks[index].Name
completeTask(&tasks, index)
// Display all tasks
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' marked as completed!\n", taskName)
// Count completed and incomplete tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := len(tasks) - completedCount
// Print summary
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}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