タスクの削除
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 24/68。
チャレンジ
簡単タスク管理システムのこのパートでは、リストからタスクを削除する機能を実装します。このチャレンジでは、append 関数を使用して特定の要素を除いたスライスを再構築するスライス操作に焦点を当て、データ構造からアイテムを永続的に削除する方法を学びます。
3つの入力を受け取ります:
- タスクの数(例:
"4")を表す文字列 "name1:status1,name2:status2,name3:status3"という形式のタスクデータを含む文字列。ここで status は"true"または"false"です(例:"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true")- 削除するタスクのインデックスを表す文字列(例:2番目のタスクの場合は
"1"。0ベースのインデックスを使用します)
あなたのタスクは以下の通りです:
- 以前のチャレンジと同じ、
Name(string) とCompleted(bool) フィールドを持つTask構造体を定義します Task構造体のスライスとインデックス (int) をパラメータとして受け取るremoveTaskという名前の関数を作成しますremoveTask関数内で、appendを使用して対象のインデックスの前後の要素を結合することにより、指定されたインデックスのタスクが削除された新しいスライスを返します- 2番目の入力からタスクデータを解析して、タスクのスライスを作成します:
- 入力をカンマで分割して、個々のタスクエントリを取得します
- 各エントリをコロンで分割して、名前とステータスを分離します
- ステータス文字列をブール値に変換します(
"true"はtrueに、"false"はfalseになります)
- 3番目の入力文字列を整数に変換して、タスクのインデックスを取得します
removeTask関数を呼び出す前に、削除されるタスクの名前を保存しておきます- スライスとインデックスを指定して
removeTask関数を呼び出し、返されたスライスを保存します - タスクを削除した後、以前のチャレンジと同じ形式ですべての残りのタスクを表示します:
- 完了したタスクの場合:
"[x] [task_name]" - 未完了のタスクの場合:
"[ ] [task_name]"
- 完了したタスクの場合:
- 確認メッセージを出力します:
"Task '[task_name]' removed successfully!" - 更新されたサマリーを出力します:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
インデックス文字列を整数に変換するには strconv パッケージを使用してください。このチャレンジでは、対象の要素の前後の部分を結合してスライスを再構築するために append を使用する方法を示します。これにより、残りの要素の順序を維持しながら、コレクションからアイテムを効果的に削除できます。
自分で試してみよう
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)
}