En Go, los mapas son intrínsecamente desordenados. Cuando iteras sobre un mapa utilizando un bucle for range, el orden de iteración es aleatorio. Antes de la llegada de los genéricos, los desarrolladores tenían que escribir código repetitivo o funciones específicas para cada tipo con el fin de extraer y ordenar las claves de un mapa.
Con los genéricos del Go moderno y los paquetes de la biblioteca estándar (cmp y slices), implementar una función SortedKeys limpia y reutilizable resulta directo y conciso.
package main
import (
"cmp"
"slices"
"fmt"
)
// SortedKeys extrae todas las claves de un mapa y las devuelve ordenadas.
// Funciona para cualquier mapa cuyo tipo de clave sea ordenable (enteros, flotantes, cadenas).
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() {
// Ejemplo 1: Claves enteras
intMap := map[int]string{3: "three", 1: "one", 2: "two"}
fmt.Println(SortedKeys(intMap))
// Salida: [1 2 3]
// Ejemplo 2: Claves de cadena
strMap := map[string]int{"banana": 2, "apple": 4, "cherry": 1}
fmt.Println(SortedKeys(strMap))
// Salida: [apple banana cherry]
}
K cmp.Ordered, V any):K cmp.Ordered restringe las claves del mapa a tipos que admiten operadores de comparación (<, >, <=, >=), como números enteros, números en coma flotante y cadenas de texto.V any permite que los valores del mapa sean de cualquier tipo (any es un alias de interface{}).make([]K, 0, len(m)) preasigna un slice con una capacidad igual a la longitud del mapa, evitando costosas reasignaciones dinámicas de memoria durante el bucle append.for k := range m recopila todas las claves dentro del slice.slices.Sort(r) ordena el slice de claves in situ utilizando los algoritmos de ordenación altamente optimizados de Go.En junio de 2020, cuando los genéricos de Go aún se encontraban en fase de borrador de diseño, los desarrolladores tenían que implementar manualmente tipos personalizados que satisficieran sort.Interface:
// Enfoque antiguo del borrador de diseño previo a Go 1.18 (Obsoleto)
type Ordered interface {
type int, int8, ... // listas de tipos en 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] }
Hoy en día, el Go moderno ofrece:
cmp.Ordered (en la biblioteca estándar desde Go 1.21): Elimina la necesidad de definir conjuntos de tipos de interfaz personalizados para tipos ordenables.slices.Sort (en la biblioteca estándar desde Go 1.21): Elimina la implementación repetitiva de sort.Interface (Len, Less, Swap), convirtiendo la ordenación de un slice en una única llamada a función clara y legible.Obtén la edición sin conexión de El Estilo de Vida de Kaue—una guía práctica para optimizar 🍏 Salud, 💰 Riqueza, ❤️ Amor y 🧘 Sentido.
Recibe notificaciones cuando publique nuevos ensayos, resúmenes de libros y guías prácticas sobre cómo vivir bien. Sin spam—cancela cuando quieras.
¿Tienes alguna pregunta, perspectiva o sugerencia? Comparte tus ideas abajo. Los comentarios funcionan con GitHub Discussions (sin anuncios y sin spam)—haz clic en Iniciar sesión con GitHub abajo para comentar o reaccionar (crear una cuenta gratuita en GitHub toma menos de un minuto).
Actualizado el 11 oct 2026.
AVISO LEGAL: El contenido de este sitio tiene fines exclusivamente informativos y educativos y no constituye asesoramiento médico, psicológico, financiero, de inversión, fiscal ni legal. Las ideas, la selección y las opiniones aquí presentadas son exclusivamente mías y no representan las de mi empleador. Los resúmenes de libros, conferencias y artículos son comentarios educativos independientes y siguen siendo propiedad intelectual de sus respectivos autores. Se pueden utilizar herramientas de IA para ayudar en la edición, el formato y la síntesis; aunque se hace todo lo posible por garantizar la precisión, pueden producirse errores. PRIVACIDAD: Este sitio utiliza servicios de terceros para la suscripción opcional al boletín (follow.it), los comentarios (giscus / GitHub Discussions) y el contenido multimedia incrustado (YouTube), que pueden procesar las direcciones IP y las cookies de los visitantes de acuerdo con sus respectivas políticas de privacidad.