Завершение задачи
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 23 из 68.
Задание
ЛегкоВ этой части системы управления задачами ты реализуешь возможность отмечать задачи как выполненные. Это задание посвящено использованию методов с указателем-получателем для изменения исходных данных задачи и демонстрирует, как указатели позволяют навсегда обновлять поля структуры.
Важное примечание: Поскольку имена задач могут содержать пробелы (например, "Buy groceries"), для чтения целых строк ввода нужно использовать bufio.Scanner. Функция fmt.Scanf прекращает чтение на первом пробеле, из-за чего имена задач с пробелами будут прочитаны некорректно. Используй bufio.NewScanner(os.Stdin) и вызывай scanner.Scan(), а затем scanner.Text(), чтобы читать строки целиком.
Ты получишь три входных значения:
- Строку, представляющую количество задач (например,
"4") - Строку с данными задач в формате:
"name1:status1,name2:status2,name3:status3", где статус — это либо"true", либо"false"(например,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Строку, представляющую индекс задачи, которую нужно выполнить (например,
"2"для третьей задачи при нумерации с 0)
Твоя задача:
- Определи ту же структуру
Task, что и в предыдущих заданиях, с полямиName(string) иCompleted(bool) - Создай функцию с именем
completeTask, которая принимает в качестве параметров указатель на срез структурTaskи индекс (int) - Внутри функции
completeTaskизмени полеCompletedзадачи с заданным индексом наtrue - Используй
bufio.Scanner, чтобы правильно читать строки ввода:- Создай сканер:
scanner := bufio.NewScanner(os.Stdin) - Для каждой строки ввода вызови
scanner.Scan(), а затемscanner.Text() - Это гарантирует, что имена задач с пробелами будут прочитаны правильно
- Создай сканер:
- Разбери данные задач из второго входного значения, чтобы создать срез задач:
- Раздели ввод по запятым, чтобы получить отдельные записи задач
- Для каждой записи выполни разделение по двоеточию, чтобы отделить имя от статуса
- Преобразуй строку статуса в логическое значение (
"true"становитсяtrue,"false"становитсяfalse)
- Преобразуй третью входную строку в целое число, чтобы получить индекс задачи
- Вызови функцию
completeTask, передав ей указатель на срез и индекс - После выполнения задачи отобрази все задачи в том же формате, что и в предыдущем задании:
- Для выполненных задач:
"[x] [task_name]" - Для невыполненных задач:
"[ ] [task_name]"
- Для выполненных задач:
- Выведи сообщение с подтверждением:
"Task '[task_name]' marked as completed!" - Выведи обновлённую сводку:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Используй пакет strconv, чтобы преобразовать строку индекса в целое число. Это задание демонстрирует, как методы с указателем-получателем позволяют изменять исходную структуру данных, внося постоянные изменения в список задач, которые сохраняются после возврата из функции.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func viewAllTasks(tasks []Task) {
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", 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
taskEntries := strings.Split(taskData, ",")
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
completed, _ := strconv.ParseBool(parts[1])
task := Task{
Name: name,
Completed: completed,
}
tasks = append(tasks, task)
}
}
viewAllTasks(tasks)
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := numTasks - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go