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