Sergey Nivens - Fotolia
So erstellen und nutzen Sie Maps mit Golang
Maps sind dank ihrer Effizienz und Geschwindigkeit eine beliebte Datenstruktur für Programmierer. In Go sind Maps aufgrund ihrer einzigartigen Eigenschaften besonders nützlich.
In der Computerprogrammierung ist eine Map eine Datenstruktur, die Schlüssel-Wert-Paare speichert. Jedem Schlüssel ist ein entsprechender Wert zugeordnet, der durch einen Verweis auf den Schlüssel abgerufen wird.
Programmierer entscheiden sich oft für die Arbeit mit Maps, weil sie effizienter sind. Maps – auch Hash-Tabellen, assoziative Arrays, Symboltabellen oder Wörterbücher genannt – ermöglichen im Vergleich zu Arrays ein schnelleres Einfügen, Abrufen und Entfernen von Daten.
Maps erreichen dies mit einer Hash-Funktion, die mit einem Array kombiniert wird, das wiederum aus Arrays von Schlüssel-Wert-Paaren besteht. Wenn ein Schlüssel zu einer Map hinzugefügt wird, gibt die Hashing-Funktion eine auf dem Schlüssel basierende Ganzzahl zurück. Um den Schlüssel wiederzufinden, muss die Hashing-Funktion jedes Mal dieselbe ganze Zahl zurückgeben.
Um einen neuen Schlüssel einzufügen, wird die von der Hashing-Funktion zurückgegebene Ganzzahl verwendet, um das Schlüssel-Wert-Paar in einem der oben genannten Arrays zu platzieren, das als Bucket mit Schlüssel-Wert-Paaren fungiert. Bei der Suche nach einem Schlüssel durchforstet die Hashing-Funktion nicht die gesamte Map, sondern beschränkt den Suchraum auf einen bestimmten Bucket, der eine Teilmenge der zu durchsuchenden Schlüssel enthält.
Auf einer hohen Ebene ist es einfach zu sehen, wie Maps Zeit und Berechnungen im Vergleich zu Arrays sparen können, bei denen das gesamte Array durchsucht werden muss, um ein Element zu finden. Um die Details der Funktionsweise von Maps zu verstehen, sehen Sie sich einige Beispiele für Operationen mit Maps in Go, auch bekannt als Golang, an.
Zuweisen und Überschreiben von Werten in Go-Maps
Die in Abbildung 1 gezeigte Map trägt den Namen models und speichert verschiedene Modelle von Autoherstellern. Eine Map ist nicht die beste Struktur für jede Art von Daten, aber in diesem Fall ist sie ideal. Da jeder Hersteller eine bestimmte Anzahl von Modellen hat, gibt es eine klare Zuordnung zwischen jedem Autohersteller und den von ihm hergestellten Modellen. Bei der Erstellung von Maps wird diese Art von Schlüssel-Wert-Beziehung berücksichtigt.
Der Code in Abbildung 1 erstellt in Zeile 6 eine Map und gibt an, dass die Schlüssel vom Typ String sind und die Werte Arrays von Strings sind, die als []String angegeben werden. In Zeile 8 wird dem Schlüssel Ford ein Array mit drei Elementen zugewiesen. In der endgültigen Ausgabe ist der Schlüssel Ford jedoch mit einem Array von nur einem Element verbunden.
Um dieses Ergebnis zu verstehen, muss man sich daran erinnern, dass Schlüssel in Go-Maps eindeutig sein müssen. Da es für jeden Schlüssel nur einen Wert gibt, wird durch die Zuweisung eines Wertes zu einem vorhandenen Schlüssel der vorhandene Wert überschrieben. Folglich ist der Wert des Schlüssels Ford in der endgültigen Ausgabe ein Array, das nur die Zeichenkette Mustang Mach-E enthält – nicht die anderen Werte, die dem Schlüssel Ford zuvor zugewiesen wurden.
Ändern vorhandener Werte in Go-Maps
Abbildung 2 zeigt ein Beispiel für das Ändern eines vorhandenen Wertes in einer Map, statt des Überschreibens.
In Zeile 12 wird auf den Schlüssel Ford verwiesen, statt den Wert komplett neu zuzuweisen, was den alten Wert überschreiben würde. Der Verweis auf den Schlüssel gibt den zuvor zugewiesenen Wert zurück, und ein neues Element wird an das bestehende Array angehängt.
Ausnutzen von Nullwerten in Go-Maps
Natürlich ist das Verknüpfen von eindeutigen Schlüsseln mit Werten nur ein kleiner Teil dessen, was Maps so nützlich macht. In Go haben Maps eine praktische Funktion, bei der ein Schlüssel einen Nullwert zurückgibt, wenn für diesen Schlüssel kein Wert gesetzt ist. Wenn Sie das in Python versuchen, erhalten Sie eine KeyError-Ausnahme.
In Abbildung 3 wird in Zeile 12 der Schlüssel Subaru gesetzt, indem die Zeichenkette Forester an das Ergebnis der Abfrage der bereits unter dem Schlüssel Subaru gespeicherten Werte angehängt wird. In diesem Fall wird kein Wert für den Schlüssel gesetzt, also setzt Go den Anfangswert des Arrays auf Null. Das Ausführen der Operation gibt ein leeres Array zurück und fügt die Zeichenkette Forester an dieses Array an.
Ohne die Fähigkeit von Go, Nullwerte zurückzugeben, müsste dieses Programm zunächst prüfen, ob ein Schlüssel bereits gesetzt ist, und dann den Schlüssel erneut referenzieren, um die vorhandenen Werte mit der neu hinzugefügten Zeichenfolge zu kombinieren. Nullwerte in Go-Maps sorgen für saubereren Code, der weniger Schritte enthält und einen intuitiveren Ablauf hat.
Verständnis der Reihenfolge in Go-Maps
Ein wichtiger Hinweis zu Go-Maps ist, dass Schlüssel-Wert-Paare nicht geordnet sind. Das bedeutet, dass sich die Reihenfolge der Map von Iteration zu Iteration ändern kann, wie in Abbildung 4 dargestellt. Das Beispiel zeigt die Ergebnisse nach dem mehrfachen Ausführen eines Programms zum Drucken der Map, aber selbst wenn das Programm zwei separate for-Schleifen enthielte, wäre die Reihenfolge der Ausführung nicht garantiert.
Es gibt Pakete von Drittanbietern, die geordnete Maps in Go erstellen. Alternativ sortieren Programmierer Maps auch mit dem Sortierpaket von Go. In den meisten Fällen reicht jedoch eine ungeordnete Standard-Map aus, da viele Programme und Funktionen, die Maps verwenden, nicht auf die Reihenfolge ihrer Schlüssel-Wert-Paare angewiesen sind.
Für Lösungen, die komplexere Datenstrukturen als Arrays, verknüpfte Listen oder binäre Bäume benötigen, sind Maps oft eine gute Lösung. In Golang haben Maps einzigartige Eigenschaften, die gutes Code-Design unterstützen und die Entwicklung einfacher machen – aber es gibt auch einige interessante Nachteile im Vergleich zur Unterstützung von Maps in anderen Sprachen.