Elemente zu einem Set hinzufügen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 33 von 68.
Nachdem Sie nun ein Set erstellt haben, besteht der nächste Schritt darin, zu lernen, wie man Elemente hinzufügt. Da ein Go-Set im Grunde eine Map ist, ist das Hinzufügen eines Elements zu einem Set identisch mit dem Hinzufügen eines Schlüssels zu einer Map.
Um ein Element zu Ihrem Set hinzuzufügen, weisen Sie einfach den leeren struct-Wert einem neuen Schlüssel zu:
colors["yellow"] = struct{}{}Die struct{}{}-Syntax erstellt ein leeres Struct-Literal. Das erste struct{} gibt den Typ an, und das zweite {} initialisiert ihn. Dies ist der Standardweg, um Elemente zu einem Set in Go hinzuzufügen.
Das Schöne an diesem Ansatz ist, dass beim Versuch, dasselbe Element erneut hinzuzufügen, der vorhandene Eintrag einfach überschrieben wird, wodurch die Eindeutigkeitseigenschaft des Sets erhalten bleibt.
Beachten Sie, dass struct{}{} die einzige gültige Syntax für diese Zuweisung ist – das Schreiben von nur {} ohne den Typnamen führt zu einem Kompilierungsfehler: missing type in composite literal. Der Typ muss immer explizit angegeben werden, wenn ein Wert einem Map-Schlüssel außerhalb eines Map-Literals zugewiesen wird.
Das Hinzufügen von Elementen zu einem Set ist schnell und unkompliziert. Dabei wird die effiziente Map-Implementierung von Go genutzt, während Sie echtes Set-Verhalten zur Verfolgung eindeutiger Elemente erhalten.
Aufgabe
EinfachErstellen Sie ein Skill-Tracking-System, das die technischen Fähigkeiten eines Entwicklers mithilfe des Go-Set-Idioms verwaltet. Diese Herausforderung zeigt, wie man neue Fähigkeiten zu einem Set hinzufügt, Duplikate verhindert und den Lernfortschritt verfolgt.
Sie erhalten zwei Eingaben:
- Einen String, der die erwartete Anzahl an Fähigkeiten darstellt (z. B.
"5") - dies dient nur als Referenz - Einen String, der Fähigkeiten enthält, die durch Kommas getrennt sind (z. B.
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Ihre Aufgabe ist es:
- Erstellen Sie ein Set mit dem Go-Idiom
map[string]struct{}, um eindeutige technische Fähigkeiten zu speichern - Initialisieren Sie das Set mit drei Start-Fähigkeiten:
"Programming","Problem Solving"und"Communication" - Verarbeiten Sie den Eingabestring, indem Sie ihn an den Kommas aufteilen, um einzelne Skill-Namen zu erhalten
- Verarbeiten Sie ALLE Fähigkeiten aus dem kommagetrennten String (iterieren Sie durch den gesamten Slice, ohne den count-Parameter zu verwenden)
- Fügen Sie jede Fähigkeit aus der Eingabe Ihrem Set hinzu, wobei Sie
struct{}{}als Wert verwenden - Zeigen Sie die Verarbeitungsergebnisse an, indem Sie jede Fähigkeit ausgeben, während sie verarbeitet 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 zeigen Sie eine Zusammenfassung des Fortschritts an:
"Skills processed: [total_processed]"- verwenden Sie die Länge des Skill-Slices"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Listen Sie abschließend alle Fähigkeiten im Skill-Set des Entwicklers auf:
- Überschrift:
"Complete skill set:" - Jede Fähigkeit in einer eigenen Zeile:
"✓ [skill]"
- Überschrift:
Wichtig: Verwenden Sie range, um über alle Fähigkeiten im Slice zu iterieren, nicht den count-Parameter. Der count wird als Referenz bereitgestellt, sollte aber Ihre Schleife nicht steuern. Verwenden Sie das strings-Paket, um den Eingabestring aufzuteilen. Um zu prüfen, ob eine Fähigkeit bereits existiert, bevor Sie sie hinzufügen, verwenden Sie das Comma-Ok-Idiom: _, exists := skillSet[skill]. Diese Herausforderung zeigt, wie das Hinzufügen von Elementen zu einem Go-Set automatisch die Eindeutigkeit handhabt und gleichzeitig eine schnelle Performance für die Prüfung der Mitgliedschaft bietet.
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)
// Konvertiere den count-String in einen Integer (nur zur Referenz - wird nicht in der Schleife verwendet)
_, _ = strconv.Atoi(countStr)
// Initialisiere das skillSet mit Start-Skills
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Teile den skills-String in einzelne Skills auf
skills := strings.Split(skillsStr, ",")
// TODO: Schreibe deinen Code unten
// Verarbeite jeden Skill mit range, um über ALLE Skills im Slice zu iterieren
// Verwende das comma ok Idiom: _, exists := skillSet[skill]
// Füge neue Skills hinzu mit: skillSet[skill] = struct{}{}
// Zeige die Verarbeitungsergebnisse für jeden Skill an
// Berechne und zeige die Fortschrittszusammenfassung unter Verwendung von len(skills) an
// Liste alle Skills im vollständigen Skill-Set auf (erwäge eine Sortierung für eine konsistente Ausgabe)
}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