Eine Aufgabe entfernen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 24 von 68.
Aufgabe
EinfachIn diesem Teil deines Aufgabenverwaltungssystems implementierst du die Möglichkeit, Aufgaben aus deiner Liste zu entfernen. Diese Herausforderung konzentriert sich auf die Manipulation von Slices mithilfe der Funktion append, um einen Slice ohne ein bestimmtes Element neu zu erstellen, und zeigt, wie du Elemente dauerhaft aus deiner Datenstruktur entfernst.
Du erhältst drei Eingaben:
- Eine Zeichenkette, die die Anzahl der Aufgaben darstellt (z. B.
"4") - Eine Zeichenkette mit Aufgabendaten 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:true") - Eine Zeichenkette, die den Index der zu entfernenden Aufgabe darstellt (z. B.
"1"für die zweite Aufgabe bei einer Indizierung ab 0)
Deine Aufgabe ist es:
- Dieselbe
Task-Struktur wie in den vorherigen Herausforderungen zu definieren, mit den FeldernName(string) undCompleted(bool) - Eine Funktion namens
removeTaskzu erstellen, die einen Slice vonTask-Strukturen und einen Index (int) als Parameter übernimmt - Innerhalb der Funktion
removeTaskeinen neuen Slice zurückzugeben, aus dem die Aufgabe am angegebenen Index entfernt wurde, indemappendverwendet wird, um die Elemente vor und nach dem Zielindex zu verbinden - Die Aufgabendaten aus der zweiten Eingabe zu verarbeiten, um deinen Slice von Aufgaben zu erstellen:
- Die Eingabe durch 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 Zeichenkette der dritten Eingabe in eine Ganzzahl umwandeln, um den Aufgabenindex zu erhalten
- Den Namen der zu entfernenden Aufgabe speichern, bevor die Funktion
removeTaskaufgerufen wird - Deine Funktion
removeTaskmit deinem Slice und dem Index aufrufen und den zurückgegebenen Slice speichern - Nach dem Entfernen der Aufgabe alle verbleibenden Aufgaben im selben Format wie in den vorherigen Herausforderungen ausgeben:
- Für abgeschlossene Aufgaben:
"[x] [task_name]" - Für nicht abgeschlossene Aufgaben:
"[ ] [task_name]"
- Für abgeschlossene Aufgaben:
- Eine Bestätigungsnachricht ausgeben:
"Task '[task_name]' removed successfully!" - Die aktualisierte Zusammenfassung ausgeben:
"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 du append verwenden kannst, um Slices durch das Verbinden von Teilen vor und nach einem Zielelement neu zu erstellen und dadurch effektiv Elemente aus deiner Sammlung zu entfernen, während die Reihenfolge der verbleibenden Elemente erhalten bleibt.
Probier es selbst
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)
}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