Em Go, os mapas (map) são inerentemente desordenados. Quando você itera sobre um mapa usando um loop for range, a ordem de iteração é randomizada. Antes dos generics, os desenvolvedores precisavam escrever código repetitivo (boilerplate) ou funções específicas para cada tipo a fim de extrair e ordenar as chaves de um mapa.
Com os generics modernos do Go e os pacotes da biblioteca padrão (cmp e slices), implementar uma função SortedKeys limpa e reutilizável é simples e conciso.
package main
import (
"cmp"
"slices"
"fmt"
)
// SortedKeys extracts all keys from a map and returns them in sorted order.
// It works for any map where the key type is ordered (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() {
// Example 1: Integer keys
intMap := map[int]string{3: "three", 1: "one", 2: "two"}
fmt.Println(SortedKeys(intMap))
// Output: [1 2 3]
// Example 2: String keys
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 restringe as chaves do mapa a tipos que suportam operadores de comparação (<, >, <=, >=), como inteiros, números de ponto flutuante e strings.V any permite que os valores do mapa sejam de qualquer tipo (any é um apelido para interface{}).make([]K, 0, len(m)) pré-aloca um slice com capacidade igual ao tamanho do mapa, evitando realocações dinâmicas de memória custosas durante o loop de append.for k := range m coleta todas as chaves no slice.slices.Sort(r) ordena o slice de chaves in-place (no próprio local) usando os algoritmos de ordenação altamente otimizados do Go.Em junho de 2020, quando os generics do Go ainda estavam na fase de proposta de design, os desenvolvedores precisavam implementar manualmente tipos personalizados que satisfizessem sort.Interface:
// Old pre-Go 1.18 design draft approach (Obsolete)
type Ordered interface {
type int, int8, ... // type lists 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] }
Hoje, o Go moderno oferece:
cmp.Ordered (na biblioteca padrão desde o Go 1.21): Elimina a necessidade de definir conjuntos de tipos personalizados em interfaces para tipos ordenáveis.slices.Sort (na biblioteca padrão desde o Go 1.21): Elimina a implementação repetitiva de sort.Interface (Len, Less, Swap), tornando a ordenação de slices uma única chamada de função legível.Baixe a edição offline selecionada de O Estilo de Vida do Kaue—um guia prático para otimizar 🍏 Saúde, 💰 Riqueza, ❤️ Amor e 🧘 Sentido.
Receba notificações quando eu publicar novos ensaios, resumos de livros e guias práticos sobre como viver bem. Sem spam—cancele quando quiser.
Tem alguma pergunta, perspectiva ou sugestão? Compartilhe suas ideias abaixo. Os comentários usam o GitHub Discussions (sem anúncios e sem spam)—clique em Entrar com o GitHub abaixo para comentar ou reagir (criar uma conta gratuita no GitHub leva menos de um minuto).
Atualizado em 11 de out. de 2026.
AVISO LEGAL: O conteúdo deste site tem finalidade exclusivamente informativa e educacional e não constitui aconselhamento médico, psicológico, financeiro, de investimentos, tributário ou jurídico. As ideias, a curadoria e as opiniões aqui apresentadas são exclusivamente minhas e não representam as do meu empregador. Os resumos de livros, palestras e artigos são comentários educacionais independentes e permanecem propriedade intelectual de seus respectivos autores. Ferramentas de IA podem ser utilizadas para auxiliar na edição, formatação e síntese; embora todos os esforços sejam feitos para garantir a precisão, erros podem ocorrer. PRIVACIDADE: Este site utiliza serviços de terceiros para inscrição opcional em newsletter (follow.it), comentários (giscus / GitHub Discussions) e mídia incorporada (YouTube), que podem processar endereços IP e cookies dos visitantes de acordo com suas respectivas políticas de privacidade.