Maps von Structs
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 26 von 68.
Maps werden unglaublich mächtig, wenn Sie Structs als Werte speichern. Dieses Muster ermöglicht es Ihnen, komplexe, strukturierte Daten zu organisieren, indem Sie aussagekräftige Schlüssel für eine einfache Suche und Abfrage verwenden.
Wenn Sie Structs als Map-Werte verwenden, erstellen Sie im Wesentlichen eine Sammlung, bei der jeder Schlüssel auf einen vollständigen Datensatz verweist. So deklarieren und initialisieren Sie eine solche Map:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Du kannst auf die Struct-Daten über die Map zugreifen und mit ihnen arbeiten, genau wie bei jeder anderen Map-Operation. Um die Informationen eines Studenten abzurufen, verwendest du einfach seinen Namen als Schlüssel:
alice := students["Alice"]
fmt.Println(alice.ID) // gibt aus: 101
fmt.Println(alice.Grade) // gibt aus: ADieses Muster ist in Go-Anwendungen äußerst verbreitet, um Sammlungen zusammengehöriger Daten zu speichern, wie z. B. Benutzerprofile, Produktkataloge oder Konfigurationseinstellungen, bei denen Sie sowohl strukturierte Daten als auch einen schnellen schlüsselbasierten Zugriff benötigen.
Aufgabe
EinfachErstelle ein Studenten-Notenverwaltungssystem unter Verwendung von Maps mit Structs als Werten. Diese Herausforderung zeigt, wie du komplexe Studentendaten mithilfe aussagekräftiger Schlüssel für effiziente Suche und Abruf organisierst.
Du erhältst zwei Eingaben:
- Eine Zeichenkette, die die Anzahl der Studenten darstellt (z. B.
"4") - Eine Zeichenkette mit Studentendaten im Format:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(z. B."Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Deine Aufgabe ist:
- Definiere einen
Student-Struct mit den folgenden Feldern:ID(int) – die ID-Nummer des StudentenGrade(string) – die Buchstabennote des Studenten
- Erstelle eine Map, deren Schlüssel die Namen der Studenten (Strings) und deren Werte
Student-Structs sind - Verarbeite die Studentendaten aus der zweiten Eingabe:
- Teile die Eingabe an den Kommas, um einzelne Studenteneinträge zu erhalten
- Teile jeden Eintrag an den Doppelpunkten, um Name, ID und Note zu trennen
- Wandle die ID-Zeichenkette in eine Ganzzahl um
- Erstelle einen
Student-Struct und füge ihn mit dem Namen als Schlüssel zur Map hinzu
- Zeige alle Studenten in alphabetischer Reihenfolge nach Namen im Format
"[name]: ID [id], Grade [grade]"an - Berechne und zeige die Notenstatistiken an:
- Zähle, wie viele Studenten jede Note (A, B, C, D, F) haben
- Zeige die Anzahl für jede vorkommende Note im Format
"Grade [grade]: [count] students"an - Zeige die Noten in alphabetischer Reihenfolge (A, B, C, D, F) an
- Finde den Studenten mit der höchsten ID und zeige ihn im Format
"Highest ID: [name] ([id])"an - Zeige die Gesamtzahl der Studenten an:
"Total students: [count]"
Verwende das Paket strconv, um die ID-Zeichenkette in eine Ganzzahl umzuwandeln, und das Paket sort, um die Namen der Studenten alphabetisch zu sortieren. Diese Herausforderung zeigt, wie Maps mit Struct-Werten eine effiziente Möglichkeit bieten, komplexe Datensammlungen mithilfe aussagekräftiger Bezeichner zu organisieren und darauf zuzugreifen.
Probier es selbst
package main
import (
"fmt"
)
func main() {
// Eingabe lesen
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Student-Struktur hier definieren
// TODO: Eine Map erstellen, um Studenten zu speichern (Name als Schlüssel, Student-Struktur als Wert)
// TODO: Die Studentendaten parsen und die Map füllen
// TODO: Alle Studenten in alphabetischer Reihenfolge nach Namen anzeigen
// TODO: Notenstatistik berechnen und anzeigen
// TODO: Den Studenten mit der höchsten ID finden und anzeigen
// TODO: Die Gesamtzahl der Studenten anzeigen
}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 VerhaltenÜbe selbstständig: Online-Go-Compiler