Eine Aufgabe abschließen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 23 von 68.
Aufgabe
EinfachIn diesem Teil deines Aufgabenverwaltungssystems implementierst du 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 zeigt, wie Pointer das dauerhafte Aktualisieren von Struct-Feldern ermöglichen.
Wichtiger Hinweis: Da Aufgabennamen Leerzeichen enthalten können (wie "Buy groceries"), musst du bufio.Scanner verwenden, um vollständige Eingabezeilen zu lesen. Die Funktion fmt.Scanf beendet das Lesen beim ersten Leerzeichen, wodurch Aufgabennamen mit Leerzeichen nicht korrekt gelesen würden. Verwende bufio.NewScanner(os.Stdin) und rufe anschließend scanner.Scan() gefolgt von scanner.Text() auf, um vollständige Zeilen zu lesen.
Du erhältst drei Eingaben:
- Eine Zeichenkette, die die Anzahl der Aufgaben darstellt (z. B.
"4") - Eine Zeichenkette mit Aufgabedaten im Format:
"name1:status1,name2:status2,name3:status3", wobei der Status entweder"true"oder"false"ist (z. B."Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Eine Zeichenkette, die den Index der zu erledigenden Aufgabe darstellt (z. B.
"2"für die dritte Aufgabe bei einer Indizierung ab 0)
Deine Aufgabe ist es:
- Dieselbe
Task-Struct wie in den vorherigen Herausforderungen zu definieren, mit den FeldernName(string) undCompleted(bool) - Eine Funktion namens
completeTaskzu erstellen, die einen Pointer auf einen Slice vonTask-Structs und einen Index (int) als Parameter übernimmt - Innerhalb der Funktion
completeTaskdas FeldCompletedder Aufgabe am angegebenen Index auftruezu setzen bufio.Scannerzu verwenden, um die Eingabezeilen korrekt zu lesen:- Einen Scanner erstellen:
scanner := bufio.NewScanner(os.Stdin) - Für jede Eingabezeile:
scanner.Scan()und anschließendscanner.Text()aufrufen - Dadurch wird sichergestellt, dass Aufgabennamen mit Leerzeichen korrekt gelesen werden
- Einen Scanner erstellen:
- Die Aufgabedaten aus der zweiten Eingabe zu analysieren, um deinen Slice mit Aufgaben zu erstellen:
- Die Eingabe an Kommas aufteilen, um einzelne Aufgabeneinträge zu erhalten
- Jeden Eintrag am Doppelpunkt aufteilen, um Name und Status zu trennen
- Die Statuszeichenkette in einen booleschen Wert umwandeln (
"true"wird zutrue,"false"wird zufalse)
- Die dritte Eingabezeichenkette in eine Ganzzahl umwandeln, um den Aufgabenindex zu erhalten
- Deine Funktion
completeTaskmit einem Pointer auf deinen Slice und dem Index aufzurufen - Nach dem Erledigen der Aufgabe alle Aufgaben im selben Format wie in der vorherigen Herausforderung anzuzeigen:
- Für erledigte Aufgaben:
"[x] [task_name]" - Für nicht erledigte Aufgaben:
"[ ] [task_name]"
- Für erledigte Aufgaben:
- Eine Bestätigungsnachricht auszugeben:
"Task '[task_name]' marked as completed!" - Die aktualisierte Zusammenfassung auszugeben:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Verwende das Paket strconv, um die Indexzeichenkette in eine Ganzzahl umzuwandeln. Diese Herausforderung zeigt, wie Pointer-Receiver dir ermöglichen, die ursprüngliche Datenstruktur zu ändern, sodass dauerhafte Änderungen an deiner Aufgabenliste auch nach der Rückkehr aus 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Übe selbstständig: Online-Go-Compiler