Em Go, o tipo map é amplamente utilizado por sua eficiência em acessar valores rapidamente através de chaves. Porém, devido à natureza do tipo map, não há garantia alguma sobre a ordenação das chaves durante uma iteração. Isso pode se tornar um problema quando precisamos de uma ordem específica para nossas operações, como imprimir resultados ordenados ou realizar tarefas onde a ordem é significativa.
Neste post, veremos como o package slice do Go pode nos ajudar a resolver esse problema de forma simples e clara.
Como os map funcionam
Um map no Go é implementado como uma tabela hash, que garante eficiência no acesso a valores através das suas chaves. Porém, por conta dessa implementação, a ordem em que os elementos são retornados em uma iteração não é determinada. Cada iteração pode resultar em uma ordem diferente, e o compilador Go intencionalmente embaralha a ordem das chaves para prevenir que desenvolvedores dependam acidentalmente de uma ordem específica.
Por exemplo, iterar sobre um map poderia resultar em:
map[string]int{"maçã": 10, "banana": 5, "laranja": 8}
// Iteração 1: banana, laranja, maçã
// Iteração 2: maçã, banana, laranja
O que é o package slice
O package slices, introduzido no Go 1.21, oferece funcionalidades adicionais e simplificadas para manipular slices, como ordenação, busca binária e filtragem. É especialmente útil para ordenar dados antes da iteração, garantindo uma ordem consistente.
Como iterar um map de forma ordenada
Para iterar um map de forma ordenada, precisamos seguir alguns passos claros:
Passo 1: Criar o map
Primeiro, criamos um map simples para o nosso exemplo:
scores := map[string]int{
"João": 87,
"Maria": 95,
"Carlos": 78,
"Ana": 91,
}
Passo 2: Criar e popular o slice com as chaves do map
Em seguida, vamos extrair todas as chaves do nosso map e armazená-las em um slice:
var names []string
for name := range scores {
names = append(names, name)
}
Aqui, iteramos sobre o map e coletamos apenas as chaves em nosso slice names.
Passo 3: Ordenar o slice de chaves
Agora utilizamos o package slices para ordenar as chaves:
import "slices" slices.Sort(names)
Com isso, as chaves no slice names agora estarão ordenadas alfabeticamente.
Passo 4: Iterar o map usando o slice ordenado
Finalmente, com o slice ordenado, podemos iterar o nosso map de forma previsível:
for _, name := range names {
fmt.Printf("%s: %d\\n", name, scores[name])
}
Com esse método, a saída será consistentemente ordenada por chaves:
Ana: 91 Carlos: 78 João: 87 Maria: 95
Conclusão
Embora os maps em Go não garantam ordenação de seus elementos, é fácil contornar isso usando o package slices. Ao extrair e ordenar as chaves manualmente, você garante uma iteração consistente e previsível, tornando seu código mais robusto e fácil de manter.
Gostou do conteúdo?
- ✅ Inscreva-se na nossa newsletter para receber mais dicas práticas sobre Go, Kubernetes e desenvolvimento de software diretamente no seu e-mail!
- 🚀 Torne-se um assinante pago do blog e tenha acesso a conteúdos exclusivos, como tutoriais avançados, estudos de caso e muito mais!
Faça parte da comunidade!
Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.
Livros Recomendados
Abaixo listei alguns dos melhores livros que já li sobre arquitetura de software e desenvolvimento.




