Удаление задачи
Часть раздела Логика и управление потоком путешествия по 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Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go