Удаление задачи
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 24 из 68.
Задание
ЛегкоВ этой части вашей системы управления задачами вы реализуете возможность удаления задач из списка. Эта задача сосредоточена на манипуляциях со срезами с использованием функции append для пересборки среза без определенного элемента, демонстрируя, как навсегда удалять элементы из вашей структуры данных.
Вы получите три входных значения:
- Строка, представляющая количество задач (например,
"4") - Строка, содержащая данные о задачах в формате:
"name1:status1,name2:status2,name3:status3", где статус — это либо"true", либо"false"(например,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true") - Строка, представляющая индекс задачи для удаления (например,
"1"для второй задачи, используя индексацию с нуля)
Ваша задача:
- Определить ту же структуру
Taskиз предыдущих задач с полямиName(string) иCompleted(bool) - Создать функцию с именем
removeTask, которая принимает срез структурTaskи индекс (int) в качестве параметров - Внутри функции
removeTaskвернуть новый срез, в котором удалена задача по заданному индексу, используяappendдля объединения элементов до и после целевого индекса - Разобрать данные о задачах из второго входного значения для создания среза задач:
- Разделить входную строку по запятым, чтобы получить отдельные записи о задачах
- Для каждой записи разделить строку по двоеточию, чтобы отделить имя и статус
- Преобразовать строку статуса в логическое значение (
"true"становитсяtrue,"false"становитсяfalse)
- Преобразовать третью входную строку в целое число, чтобы получить индекс задачи
- Сохранить имя задачи, которую нужно удалить, перед вызовом функции
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)
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение