In Go, le mappe sono intrinsecamente non ordinate. Quando si itera su una mappa utilizzando un ciclo for range, l’ordine di iterazione viene randomizzato. Prima dell’introduzione dei generics, gli sviluppatori dovevano scrivere codice ripetitivo (boilerplate) o funzioni specifiche per ogni tipo per estrarre e ordinare le chiavi di una mappa.
Con i moderni generics di Go e i pacchetti della libreria standard (cmp e slices), implementare una funzione SortedKeys pulita e riutilizzabile è immediato e conciso.
package main
import (
"cmp"
"slices"
"fmt"
)
// SortedKeys estrae tutte le chiavi da una mappa e le restituisce in ordine crescente.
// Funziona per qualsiasi mappa in cui il tipo della chiave sia ordinabile (int, float, string).
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() {
// Esempio 1: Chiavi intere
intMap := map[int]string{3: "three", 1: "one", 2: "two"}
fmt.Println(SortedKeys(intMap))
// Output: [1 2 3]
// Esempio 2: Chiavi stringa
strMap := map[string]int{"banana": 2, "apple": 4, "cherry": 1}
fmt.Println(SortedKeys(strMap))
// Output: [apple banana cherry]
}
K cmp.Ordered, V any):K cmp.Ordered limita le chiavi della mappa ai tipi che supportano gli operatori di confronto (<, >, <=, >=), come numeri interi, numeri in virgola mobile e stringhe.V any consente ai valori della mappa di essere di qualsiasi tipo (any è un alias per interface{}).make([]K, 0, len(m)) pre-alloca una slice con una capacità pari alla lunghezza della mappa, evitando costose riallocazioni dinamiche di memoria durante il ciclo di append.for k := range m raccoglie tutte le chiavi all’interno della slice.slices.Sort(r) ordina la slice di chiavi direttamente sul posto (in-place) utilizzando gli algoritmi di ordinamento altamente ottimizzati di Go.Nel giugno 2020, quando i generics di Go erano ancora nella fase di bozza progettuale, gli sviluppatori dovevano implementare manualmente tipi personalizzati che soddisfacessero sort.Interface:
// Vecchio approccio della bozza pre-Go 1.18 (Obsoleto)
type Ordered interface {
type int, int8, ... // liste di tipi nelle interfacce
}
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] }
Oggi, il Go moderno fornisce:
cmp.Ordered (libreria standard da Go 1.21): Elimina la necessità di definire insiemi di tipi di interfaccia personalizzati per i tipi ordinabili.slices.Sort (libreria standard da Go 1.21): Elimina l’implementazione ripetitiva di sort.Interface (Len, Less, Swap), rendendo l’ordinamento di una slice una singola e leggibile chiamata di funzione.Scarica l'edizione offline di Lo Stile di Vita di Kaue—una guida pratica per ottimizzare 🍏 Salute, 💰 Ricchezza, ❤️ Amore e 🧘 Significato.
Ricevi una notifica quando pubblico nuovi saggi, riassunti di libri e guide pratiche per vivere bene. Niente spam—annulla l'iscrizione in qualsiasi momento.
Hai una domanda, una prospettiva o un suggerimento? Condividi i tuoi pensieri qui sotto. I commenti utilizzano GitHub Discussions (senza pubblicità e senza spam)—clicca su Accedi con GitHub qui sotto per commentare o reagire (creare un account GitHub gratuito richiede meno di un minuto).
Aggiornato il 11 ott 2026.
AVVERTENZA LEGALE: Il contenuto di questo sito ha scopo esclusivamente informativo ed educativo e non costituisce consulenza medica, psicologica, finanziaria, di investimento, fiscale o legale. Le idee, la selezione e le opinioni qui presentate sono esclusivamente mie e non rappresentano quelle del mio datore di lavoro. I riassunti di libri, conferenze e articoli sono commenti educativi indipendenti e rimangono proprietà intellettuale dei rispettivi autori. Strumenti di IA possono essere utilizzati per assistere nella revisione, formattazione e sintesi; sebbene venga compiuto ogni sforzo per garantire l'accuratezza, possono verificarsi errori. PRIVACY: Questo sito utilizza servizi di terze parti per l'iscrizione facoltativa alla newsletter (follow.it), i commenti (giscus / GitHub Discussions) e i contenuti multimediali incorporati (YouTube), che possono trattare gli indirizzi IP e i cookie dei visitatori in conformità con le rispettive informative sulla privacy.