Elemente zu einem Set hinzufügen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 33 von 68.
Nachdem du nun eine Menge erstellt hast, besteht der nächste Schritt darin, zu lernen, wie man Elemente zu ihr hinzufügt. Da eine Go-Menge tatsächlich im Hintergrund eine Map ist, ist das Hinzufügen eines Elements zu einer Menge identisch mit dem Hinzufügen eines Schlüssels zu einer Map.
Um ein Element zu deiner Menge hinzuzufügen, weist du einem neuen Schlüssel einfach den Wert einer leeren Struktur zu:
colors["yellow"] = struct{}{}Die Syntax struct{}{} erstellt ein leeres Struct-Literal. Das erste struct{} gibt den Typ an, und das zweite {} initialisiert es. Dies ist die standardmäßige Methode, um Elemente zu einer Menge in Go hinzuzufügen.
Das Schöne an diesem Ansatz ist, dass beim erneuten Hinzufügen desselben Elements einfach der vorhandene Eintrag überschrieben wird, wodurch die Eigenschaft der Eindeutigkeit der Menge erhalten bleibt.
Beachte, dass struct{}{} die einzige gültige Syntax für diese Zuweisung ist: Wenn du nur {} ohne den Typnamen schreibst, führt das zu einem Kompilierungsfehler: missing type in composite literal. Der Typ muss immer explizit angegeben werden, wenn einer Map-Schlüssel außerhalb eines Map-Literals ein Wert zugewiesen wird.
Das Hinzufügen von Elementen zu einer Menge ist schnell und unkompliziert. Dabei wird Gos effiziente Map-Implementierung genutzt, während du das tatsächliche Mengenverhalten zur Nachverfolgung eindeutiger Elemente erhältst.
Aufgabe
EinfachErstelle ein System zur Erfassung von Fähigkeiten, das die technischen Fähigkeiten eines Entwicklers mithilfe des Go-Set-Idioms verwaltet. Diese Herausforderung zeigt, wie neue Fähigkeiten zu einem Set hinzugefügt werden können, während Duplikate verhindert und Lernfortschritte erfasst werden.
Du erhältst zwei Eingaben:
- Eine Zeichenfolge, die die erwartete Anzahl an Fähigkeiten darstellt (z. B.
"5") – dies dient nur als Referenz - Eine Zeichenfolge mit durch Kommas getrennten Fähigkeiten (z. B.
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Deine Aufgabe ist es:
- Ein Set mithilfe des Go-Idioms
map[string]struct{}zu erstellen, um eindeutige technische Fähigkeiten zu speichern - Das Set mit drei anfänglichen Fähigkeiten zu initialisieren:
"Programming","Problem Solving"und"Communication" - Die Eingabezeichenfolge durch Aufteilen an den Kommas zu analysieren, um einzelne Namen von Fähigkeiten zu erhalten
- Alle Fähigkeiten aus der durch Kommas getrennten Zeichenfolge zu verarbeiten (über das gesamte Slice iterieren und den Zählparameter nicht verwenden)
- Jede Fähigkeit aus der Eingabe mithilfe von
struct{}{}als Wert zu deinem Set hinzuzufügen - Die Verarbeitungsergebnisse anzuzeigen, indem jede Fähigkeit während ihrer Verarbeitung ausgegeben wird:
- Wenn die Fähigkeit neu im Set ist:
"Learning new skill: [skill]" - Wenn die Fähigkeit bereits im Set vorhanden ist:
"Already mastered: [skill]"
- Wenn die Fähigkeit neu im Set ist:
- Nach der Verarbeitung aller Fähigkeiten eine Fortschrittsübersicht anzuzeigen:
"Skills processed: [total_processed]"– verwende die Länge des Fähigkeiten-Slices"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Schließlich alle Fähigkeiten im Fähigkeiten-Set des Entwicklers aufzulisten:
- Kopfzeile:
"Complete skill set:" - Jede Fähigkeit in einer eigenen Zeile:
"✓ [skill]"
- Kopfzeile:
Wichtig: Verwende range, um über alle Fähigkeiten im Slice zu iterieren, nicht den Zählparameter. Die Anzahl wird als Referenz bereitgestellt, sollte aber nicht deine Schleife steuern. Verwende das Paket strings, um die Eingabezeichenfolge aufzuteilen. Um zu überprüfen, ob eine Fähigkeit bereits vorhanden ist, bevor du sie hinzufügst, verwende das Komma-ok-Idiom: _, exists := skillSet[skill]. Diese Herausforderung zeigt, wie das Hinzufügen von Elementen zu einem Go-Set automatisch die Eindeutigkeit sicherstellt und gleichzeitig eine schnelle Suche zur Überprüfung der Mitgliedschaft ermöglicht.
Probier es selbst
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Eingabe lesen
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// count-String in Integer umwandeln (nur als Referenz - wird in der Schleife nicht verwendet)
_, _ = strconv.Atoi(countStr)
// Skill-Set mit Starter-Skills initialisieren
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// skills-String in einzelne Skills aufteilen
skills := strings.Split(skillsStr, ",")
// TODO: Schreibe deinen Code darunter
// Jeden Skill mit range verarbeiten, um über ALLE Skills im Slice zu iterieren
// Komma-ok-Idiom verwenden: _, exists := skillSet[skill]
// Neue Skills hinzufügen mit: skillSet[skill] = struct{}{}
// Verarbeitungsergebnisse für jeden Skill anzeigen
// Fortschrittszusammenfassung mit len(skills) berechnen und anzeigen
// List all skills in the complete skill set (consider sorting for consistent output)
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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 Verhalten6Idiomatisches Go: Sets
Das Set-Idiom in GoEin Set erstellenElemente zu einem Set hinzufügenPrüfen auf MitgliedschaftAus einem Set entfernenÜber ein Set iterierenZusammenfassung – Eindeutige BenutzernamenÜbe selbstständig: Online-Go-Compiler