🔑 Obtenir les clés triées d’une map en Go avec les génériques 🔗

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.

📑 Table des Matières 🔗


💻 L’implémentation moderne (Go 1.21+) 🔗

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]
}

⚙️ Comment ça marche 🔗

  1. Contraintes de types génériques (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{}).
  2. Pré-allocation de la tranche (slice) :
    • 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).
  3. Extraction des clés :
    • La boucle for k := range m rassemble toutes les clés dans la tranche.
  4. Tri :
    • slices.Sort(r) trie la tranche de clés sur place (in-place) en utilisant les algorithmes de tri hautement optimisés de Go.

🚀 Pourquoi cette version est meilleure que le brouillon de 2020 🔗

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 :


📚 Téléchargez Mon Ebook Gratuit 🔗

Obtenez l'édition hors ligne de Le Mode de Vie de Kaue—un guide pratique pour optimiser 🍏 Santé, 💰 Richesse, ❤️ Amour et 🧘 Sens.

Le Mode de Vie de Kaue

Le Mode de Vie de Kaue

📬 Abonnez-vous à Ma Newsletter 🔗

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.


💬 Commentaires et Discussion 🔗

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.