En Go, les maps sont par nature non ordonnées. Lorsque vous parcourez une map à l’aide d’une boucle for range, l’ordre d’itération est aléatoire. Avant l’arrivée des génériques, les développeurs devaient écrire du code répétitif (boilerplate) ou des fonctions spécifiques à chaque type pour extraire et trier les clés d’une map.
Avec les génériques du Go moderne et les paquets de la bibliothèque standard (cmp et slices), l’implémentation d’une fonction SortedKeys propre et réutilisable est simple et concise.
package main
import (
"cmp"
"slices"
"fmt"
)
// SortedKeys extrait toutes les clés d'une map et les retourne par ordre trié.
// Elle fonctionne pour toute map dont le type de clé est ordonné (entiers, flottants, chaînes).
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() {
// Exemple 1 : Clés entières
intMap := map[int]string{3: "three", 1: "one", 2: "two"}
fmt.Println(SortedKeys(intMap))
// Sortie : [1 2 3]
// Exemple 2 : Clés sous forme de chaînes de caractères
strMap := map[string]int{"banana": 2, "apple": 4, "cherry": 1}
fmt.Println(SortedKeys(strMap))
// Sortie : [apple banana cherry]
}
K cmp.Ordered, V any) :K cmp.Ordered restreint les clés de la map aux types qui prennent en charge les opérateurs de comparaison (<, >, <=, >=), tels que les entiers, les nombres à virgule flottante et les chaînes de caractères.V any permet aux valeurs de la map d’être de n’importe quel type (any est un alias pour interface{}).make([]K, 0, len(m)) pré-alloue une tranche avec une capacité égale à la taille de la map, évitant ainsi des réallocations dynamiques de mémoire coûteuses pendant la boucle d’ajout (append).for k := range m rassemble toutes les clés dans la tranche.slices.Sort(r) trie la tranche de clés sur place (in-place) en utilisant les algorithmes de tri hautement optimisés de Go.En juin 2020, lorsque les génériques de Go n’en étaient encore qu’au stade de brouillon de conception, les développeurs devaient implémenter manuellement des types personnalisés satisfaisant sort.Interface :
// Ancienne approche issue du brouillon de conception pré-Go 1.18 (Obsolète)
type Ordered interface {
type int, int8, ... // listes de types dans les 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] }
Aujourd’hui, le Go moderne fournit :
cmp.Ordered (bibliothèque standard depuis Go 1.21) : Élimine le besoin de définir des ensembles de types d’interface personnalisés pour les types ordonnés.slices.Sort (bibliothèque standard depuis Go 1.21) : Élimine l’implémentation répétitive de sort.Interface (Len, Less, Swap), faisant du tri d’une tranche un simple appel de fonction lisible.Obtenez l'édition hors ligne de Le Mode de Vie de Kaue—un guide pratique pour optimiser 🍏 Santé, 💰 Richesse, ❤️ Amour et 🧘 Sens.
Recevez une notification lorsque je publie de nouveaux essais, résumés de livres et guides pratiques pour bien vivre. Sans spam—désabonnez-vous à tout moment.
Vous avez une question, une perspective ou une suggestion ? Partagez vos réflexions ci-dessous. Les commentaires fonctionnent avec GitHub Discussions (sans publicité et sans spam)—cliquez sur Se connecter avec GitHub ci-dessous pour commenter ou réagir (créer un compte GitHub gratuit prend moins d'une minute).
Mis à jour le 11 oct. 2026.
AVERTISSEMENT : Le contenu de ce site est fourni à titre purement informatif et éducatif et ne constitue pas un avis médical, psychologique, financier, d'investissement, fiscal ou juridique. Les idées, la sélection et les opinions présentées ici n'engagent que moi et ne représentent pas celles de mon employeur. Les résumés de livres, de conférences et d'articles sont des commentaires éducatifs indépendants et restent la propriété intellectuelle de leurs auteurs respectifs. Des outils d'IA peuvent être utilisés pour aider à l'édition, à la mise en forme et à la synthèse ; bien que tous les efforts soient déployés pour garantir l'exactitude, des erreurs peuvent survenir. CONFIDENTIALITÉ : Ce site utilise des services tiers pour l'abonnement facultatif à la newsletter (follow.it), les commentaires (giscus / GitHub Discussions) et les médias intégrés (YouTube), qui peuvent traiter les adresses IP et les cookies des visiteurs conformément à leurs politiques de confidentialité respectives.