Eine Aufgabe entfernen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 24 von 68.
Aufgabe
EinfachIn diesem Teil Ihres Aufgabenverwaltungssystems implementieren Sie die Möglichkeit, Aufgaben aus Ihrer Liste zu entfernen. Diese Herausforderung konzentriert sich auf die Manipulation von Slices unter Verwendung der append-Funktion, um ein Slice ohne ein bestimmtes Element zu rekonstruieren. Dies zeigt, wie man Elemente dauerhaft aus seiner Datenstruktur entfernt.
Sie erhalten drei Eingaben:
- Einen String, der die Anzahl der Aufgaben darstellt (z. B.
"4") - Einen String, der die 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:true") - Einen String, der den Index der zu entfernenden Aufgabe darstellt (z. B.
"1"für die zweite Aufgabe, unter Verwendung der 0-basierten 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
removeTask, die ein Slice vonTask-Strukturen und einen Index (int) als Parameter entgegennimmt - Geben Sie innerhalb der Funktion
removeTaskein neues Slice zurück, bei dem die Aufgabe am angegebenen Index entfernt wurde, indem Sieappendverwenden, um die Elemente vor und nach dem Zielindex zu kombinieren - Analysieren Sie die Aufgabendaten aus der zweiten Eingabe, um Ihr Slice von Aufgaben zu erstellen:
- Teilen Sie die Eingabe durch Kommas auf, um die einzelnen Aufgabeneinträge zu erhalten
- Teilen Sie jeden Eintrag durch einen Doppelpunkt auf, um Name und Status zu trennen
- Konvertieren Sie den Status-String in einen booleschen Wert (
"true"wird zutrue,"false"wird zufalse)
- Konvertieren Sie den dritten Eingabestring in eine Ganzzahl, um den Aufgabenindex zu erhalten
- Speichern Sie den Namen der zu entfernenden Aufgabe, bevor Sie die Funktion
removeTaskaufrufen - Rufen Sie Ihre Funktion
removeTaskmit Ihrem Slice und dem Index auf und speichern Sie das zurückgegebene Slice - Zeigen Sie nach dem Entfernen der Aufgabe alle verbleibenden Aufgaben im gleichen Format wie in den vorherigen Herausforderungen 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]' removed successfully!" - 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 man append verwendet, um Slices zu rekonstruieren, indem man Teile vor und nach einem Zielelement kombiniert und so effektiv Elemente aus Ihrer Sammlung entfernt, während die Reihenfolge der verbleibenden Elemente beibehalten wird.
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