Eine Aufgabe abschließen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 23 von 68.
Aufgabe
EinfachIn diesem Teil Ihres Aufgabenverwaltungssystems implementieren Sie die Möglichkeit, Aufgaben als erledigt zu markieren. Diese Herausforderung konzentriert sich auf die Verwendung von Pointer-Receivern, um die ursprünglichen Aufgabendaten zu ändern, und demonstriert, wie Pointer es Ihnen ermöglichen, Strukturfelder dauerhaft zu aktualisieren.
Wichtiger Hinweis: Da Aufgabennamen Leerzeichen enthalten können (wie "Buy groceries"), müssen Sie bufio.Scanner verwenden, um ganze Eingabezeilen zu lesen. Die Funktion fmt.Scanf stoppt das Lesen beim ersten Leerzeichen, was Aufgabennamen mit Leerzeichen unterbrechen würde. Verwenden Sie bufio.NewScanner(os.Stdin) und rufen Sie scanner.Scan() gefolgt von scanner.Text() auf, um vollständige Zeilen zu lesen.
Sie erhalten drei Eingaben:
- Einen String, der die Anzahl der Aufgaben darstellt (z. B.
"4") - Einen String, der Aufgabendaten im Format
"name1:status1,name2:status2,name3:status3"enthält, wobei der Status entweder"true"oder"false"ist (z. B."Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Einen String, der den Index der zu erledigenden Aufgabe darstellt (z. B.
"2"für die dritte Aufgabe, unter Verwendung von 0-basierter Indizierung)
Ihre Aufgabe ist es:
- Definieren Sie dieselbe
Task-Struktur aus den vorherigen Herausforderungen mit den FeldernName(string) undCompleted(bool) - Erstellen Sie eine Funktion namens
completeTask, die einen Pointer auf einen Slice vonTask-Strukturen und einen Index (int) als Parameter entgegennimmt - Ändern Sie innerhalb der Funktion
completeTaskdas FeldCompletedder Aufgabe am angegebenen Index auftrue - Verwenden Sie
bufio.Scanner, um die Eingabezeilen ordnungsgemäß zu lesen:- Erstellen Sie einen Scanner:
scanner := bufio.NewScanner(os.Stdin) - Für jede Eingabezeile: Rufen Sie
scanner.Scan()und dannscanner.Text()auf - Dies stellt sicher, dass Aufgabennamen mit Leerzeichen korrekt gelesen werden
- Erstellen Sie einen Scanner:
- Parsen Sie die Aufgabendaten aus der zweiten Eingabe, um Ihren Slice von Aufgaben zu erstellen:
- Teilen Sie die Eingabe durch Kommas, um die einzelnen Aufgabeneinträge zu erhalten
- Teilen Sie jeden Eintrag durch einen Doppelpunkt, um Name und Status zu trennen
- Konvertieren Sie den Status-String in einen Boolean (
"true"wird zutrue,"false"wird zufalse)
- Konvertieren Sie den dritten Eingabestring in eine Ganzzahl, um den Aufgabenindex zu erhalten
- Rufen Sie Ihre Funktion
completeTaskmit einem Pointer auf Ihren Slice und dem Index auf - Nachdem Sie die Aufgabe abgeschlossen haben, zeigen Sie alle Aufgaben im gleichen Format wie in der vorherigen Herausforderung an:
- Für erledigte Aufgaben:
"[x] [task_name]" - Für nicht erledigte Aufgaben:
"[ ] [task_name]"
- Für erledigte Aufgaben:
- Geben Sie eine Bestätigungsmeldung aus:
"Task '[task_name]' marked as completed!" - Geben Sie die aktualisierte Zusammenfassung aus:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Verwenden Sie das Paket strconv, um den Index-String in eine Ganzzahl umzuwandeln. Diese Herausforderung zeigt, wie Pointer-Receiver es Ihnen ermöglichen, die ursprüngliche Datenstruktur zu modifizieren und dauerhafte Änderungen an Ihrer Aufgabenliste vorzunehmen, die auch nach Rückkehr der Funktion bestehen bleiben.
Probier es selbst
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)
}Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten