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 verursacht einen Kompilierungsfehler: missing type in composite literal. Der Typ muss immer explizit angegeben werden, wenn einem Map-Schlüssel außerhalb eines Map-Literals ein Wert zugewiesen wird.
Das Hinzufügen von Elementen zu einem Set ist schnell und unkompliziert, wobei die effiziente map-Implementierung von Go genutzt wird, während es Ihnen echtes Set-Verhalten zur Verfolgung eindeutiger Elemente bietet.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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 einem Set neue Fähigkeiten hinzufügt, während Duplikate verhindert werden und der Lernfortschritt verfolgt wird.
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 durch Kommas getrennte Fähigkeiten enthält (z. B.
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Ihre Aufgabe ist es:
- Erstellen Sie ein Set unter Verwendung des Go-Idioms
map[string]struct{}, um eindeutige technische Fähigkeiten zu speichern - Initialisieren Sie das Set mit drei Start-Fähigkeiten:
"Programming","Problem Solving"und"Communication" - Parsen Sie den Eingabestring, indem Sie ihn an den Kommas aufteilen, um die einzelnen 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 für jede Fähigkeit aus der Eingabe diese 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 skills-Slices"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Listen Sie schließlich alle Fähigkeiten im Skill-Set des Entwicklers auf:
- Header:
"Complete skill set:" - Jede Fähigkeit in einer eigenen Zeile:
"✓ [skill]"
- Header:
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 Lookup-Performance für die Prüfung der Mitgliedschaft bietet.
Spickzettel
Um Elemente zu einem Go-Set hinzuzufügen (implementiert als map[string]struct{}), weisen Sie einem neuen Schlüssel eine leere Struktur zu:
colors["yellow"] = struct{}{}Die struct{}{} Syntax erstellt ein leeres Struktur-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.
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)
// Anzahl-String in Ganzzahl umwandeln (nur zur Referenz - wird nicht in der Schleife verwendet)
_, _ = strconv.Atoi(countStr)
// Skill-Set mit Starter-Skills initialisieren
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Skill-String in einzelne Skills aufteilen
skills := strings.Split(skillsStr, ",")
// TODO: Schreiben Sie Ihren Code unten
// Verarbeiten Sie jeden Skill mit range, um über ALLE Skills im Slice zu iterieren
// Verwenden Sie das Comma-Ok-Idiom: _, exists := skillSet[skill]
// Neue Skills hinzufügen mit: skillSet[skill] = struct{}{}
// Verarbeitungsergebnisse für jeden Skill anzeigen
// Fortschrittszusammenfassung berechnen und anzeigen unter Verwendung von len(skills)
// Alle Skills im vollständigen Skill-Set auflisten (Sortierung für konsistente Ausgabe in Betracht ziehen)
}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