In Go sind Maps von Natur aus ungeordnet. Wenn Sie mit einer for range-Schleife über eine Map iterieren, ist die Reihenfolge der Durchläufe zufällig. Vor der Einführung von Generics mussten Entwickler viel Boilerplate-Code oder typspezifische Funktionen schreiben, um die Schlüssel einer Map zu extrahieren und zu sortieren.
Mit modernen Go-Generics und den Paketen der Standardbibliothek (cmp und slices) lässt sich eine saubere, wiederverwendbare Funktion SortedKeys unkompliziert und kompakt implementieren.
package main
import (
"cmp"
"slices"
"fmt"
)
// SortedKeys extrahiert alle Schlüssel aus einer Map und gibt sie sortiert zurück.
// Das funktioniert für jede Map, deren Schlüsseltyp geordnet ist (Ints, Floats, Strings).
func SortedKeys[K cmp.Ordered, V any](m map[K]V) []K {
r := make([]K, 0, len(m))
for k := range m {
r = append(r, k)
}
slices.Sort(r)
return r
}
func main() {
// Beispiel 1: Integer-Schlüssel
intMap := map[int]string{3: "three", 1: "one", 2: "two"}
fmt.Println(SortedKeys(intMap))
// Ausgabe: [1 2 3]
// Beispiel 2: String-Schlüssel
strMap := map[string]int{"banana": 2, "apple": 4, "cherry": 1}
fmt.Println(SortedKeys(strMap))
// Ausgabe: [apple banana cherry]
}
K cmp.Ordered, V any):K cmp.Ordered beschränkt die Map-Schlüssel auf Typen, die Vergleichsoperatoren (<, >, <=, >=) unterstützen, wie etwa Ganzzahlen, Gleitkommazahlen und Strings.V any erlaubt beliebige Typen für die Map-Werte (any ist ein Alias für interface{}).make([]K, 0, len(m)) reserviert vorab einen Slice mit einer Kapazität in Höhe der Map-Länge und vermeidet so teure dynamische Speicher-Neuallokationen während der append-Schleife.for k := range m sammelt alle Schlüssel im Slice.slices.Sort(r) sortiert den Slice der Schlüssel direkt an Ort und Stelle (in-place) mithilfe der hochoptimierten Sortieralgorithmen von Go.Im Juni 2020, als sich Go-Generics noch in der Entwurfsphase befanden, mussten Entwickler eigene Typen definieren und sort.Interface manuell implementieren:
// Alter Ansatz aus dem Entwurf vor Go 1.18 (veraltet)
type Ordered interface {
type int, int8, ... // Typlisten in Interfaces
}
type orderedSlice[T Ordered] []T
func (s orderedSlice[T]) Len() int { return len(s) }
func (s orderedSlice[T]) Less(i, j int) bool { return s[i] < s[j] }
func (s orderedSlice[T]) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
Heute bietet das moderne Go:
cmp.Ordered (in der Standardbibliothek seit Go 1.21): Macht das Definieren eigener Interface-Typmengen für geordnete Typen überflüssig.slices.Sort (in der Standardbibliothek seit Go 1.21): Erspart die umständliche Implementierung von sort.Interface (Len, Less, Swap) und reduziert das Sortieren eines Slices auf einen einzigen, gut lesbaren Funktionsaufruf.Lade die kuratierte Offline-Ausgabe von Kaues Lebensweise herunter – ein praktischer Leitfaden zur Optimierung von 🍏 Gesundheit, 💰 Wohlstand, ❤️ Liebe und 🧘 Sinn.
Erhalte eine Benachrichtigung, wenn ich neue Essays, Buchzusammenfassungen und praktische Leitfäden für ein gutes Leben veröffentliche. Kein Spam – jederzeit abbestellbar.
Hast du eine Frage, eine Perspektive oder einen Vorschlag? Teile deine Gedanken unten mit. Die Kommentare werden über GitHub Discussions bereitgestellt (werbefrei und spamfrei) – klicke unten auf Mit GitHub anmelden, um zu kommentieren oder zu reagieren (ein kostenloses GitHub-Konto ist in weniger als einer Minute erstellt).
Aktualisiert am 11.10.2026.
HAFTUNGSAUSSCHLUSS: Die Inhalte auf dieser Website dienen ausschließlich Informations- und Bildungszwecken und stellen keine medizinische, psychologische, finanzielle, steuerliche oder rechtliche Beratung sowie keine Anlageberatung dar. Die hier präsentierten Ideen, Zusammenstellungen und Meinungen sind meine eigenen und spiegeln nicht die meines Arbeitgebers wider. Zusammenfassungen von Büchern, Vorträgen und Artikeln sind unabhängige Bildungskommentare und bleiben geistiges Eigentum der jeweiligen Autoren. KI-Tools können zur Unterstützung bei der Bearbeitung, Formatierung und Synthese eingesetzt werden; obwohl größte Sorgfalt auf Richtigkeit gelegt wird, können Fehler auftreten. DATENSCHUTZ: Diese Website nutzt Dienste von Drittanbietern für optionale Newsletter-Abonnements (follow.it), Kommentare (giscus / GitHub Discussions) und eingebettete Medien (YouTube), die IP-Adressen und Cookies der Besucher gemäß ihren jeweiligen Datenschutzrichtlinien verarbeiten können.