Go’s Maps sind eine grundlegende Datenstruktur zum Speichern von Schlüssel-Wert-Paaren. Das effiziente Iterieren über diese Paare ist für viele Anwendungen entscheidend. Dieser Artikel bietet eine umfassende Anleitung zur Arbeit mit Maps, von der Erstellung bis zur Traversierung, wobei Best Practices und häufige Fallstricke hervorgehoben werden.
Inhaltsverzeichnis
- Deklarieren und Initialisieren von Maps
- Iterieren über Maps
- Selektives Iterieren über Schlüssel und Werte
- Reihenfolge bei der Iteration beibehalten
Deklarieren und Initialisieren von Maps
Go Maps werden mit der Funktion make()
oder einem Composite Literal deklariert. make()
ermöglicht die Angabe einer anfänglichen Kapazität, wodurch die Leistung bei großen Maps verbessert wird. Composite Literale sind für kleinere, statisch definierte Maps prägnanter.
package main
import "fmt"
func main() {
// Mit make()
myMap := make(map[string]int, 10) //Anfangsgröße von 10
myMap["apple"] = 1
myMap["banana"] = 2
myMap["cherry"] = 3
// Mit Composite Literal
anotherMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
fmt.Println("myMap:", myMap)
fmt.Println("anotherMap:", anotherMap)
}
Iterieren über Maps
Die Standardmethode zum Iterieren über eine Go Map ist die Verwendung einer for...range
-Schleife. Wichtig ist, dass die Iterationsreihenfolge nicht garantiert ist und zwischen den Läufen variieren kann. Verlassen Sie sich nicht auf eine bestimmte Reihenfolge für Ihre Programmlogik.
package main
import "fmt"
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
for key, value := range myMap {
fmt.Printf("Key: %s, Value: %dn", key, value)
}
}
Selektives Iterieren über Schlüssel und Werte
Sie können wählen, ob Sie nur über die Schlüssel oder Werte iterieren möchten, indem Sie den leeren Bezeichner _
verwenden, um das unerwünschte Element zu ignorieren:
// Nur über Schlüssel iterieren
for key := range myMap {
fmt.Println("Key:", key)
}
// Nur über Werte iterieren
for _, value := range myMap {
fmt.Println("Value:", value)
}
Reihenfolge bei der Iteration beibehalten
Wenn eine bestimmte Iterationsreihenfolge erforderlich ist, müssen Sie eine sortierte Datenstruktur verwenden. Ein Ansatz besteht darin, einen Slice von Schlüsseln zu verwenden, diesen zu sortieren und dann den Slice zu durchlaufen und die entsprechenden Werte aus der Map abzurufen:
package main
import (
"fmt"
"sort"
)
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
keys := make([]string, 0, len(myMap))
for k := range myMap {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf("Key: %s, Value: %dn", k, myMap[k])
}
}