Os mapas em Go são uma estrutura de dados fundamental para armazenar pares chave-valor. Iterar eficientemente por esses pares é crucial para muitas aplicações. Este artigo fornece um guia completo para trabalhar com mapas, da criação à travessia, enfatizando as melhores práticas e armadilhas comuns.
Sumário
- Declarando e Inicializando Mapas
- Iterando sobre Mapas
- Iterando sobre Chaves e Valores Seletivamente
- Mantendo a Ordem durante a Iteração
Declarando e Inicializando Mapas
Mapas em Go são declarados usando a função make()
ou um literal composto. make()
permite especificar uma capacidade inicial, melhorando o desempenho para mapas grandes. Literais compostos são mais concisos para mapas menores, definidos estaticamente.
package main
import "fmt"
func main() {
// Usando make()
myMap := make(map[string]int, 10) //Capacidade inicial de 10
myMap["apple"] = 1
myMap["banana"] = 2
myMap["cherry"] = 3
// Usando literal composto
anotherMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
fmt.Println("myMap:", myMap)
fmt.Println("anotherMap:", anotherMap)
}
Iterando sobre Mapas
A maneira padrão de iterar sobre um mapa Go é usando um loop for...range
. Importantemente, a ordem de iteração não é garantida e pode variar entre execuções. Não dependa de uma ordem específica para sua lógica de programa.
package main
import "fmt"
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
for key, value := range myMap {
fmt.Printf("Chave: %s, Valor: %dn", key, value)
}
}
Iterando sobre Chaves e Valores Seletivamente
Você pode escolher iterar apenas sobre as chaves ou valores, se necessário, usando o identificador em branco _
para ignorar o elemento indesejado:
// Iterando apenas sobre as chaves
for key := range myMap {
fmt.Println("Chave:", key)
}
// Iterando apenas sobre os valores
for _, value := range myMap {
fmt.Println("Valor:", value)
}
Mantendo a Ordem durante a Iteração
Se uma ordem de iteração específica for necessária, você deve usar uma estrutura de dados ordenada. Uma abordagem é usar um slice de chaves, ordená-lo e, em seguida, iterar pelo slice, acessando os valores correspondentes do mapa:
package main
import (
"fmt"
"sort"
)
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
keys := make([]string, 0, len(myMap))
for k := range myMap {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf("Chave: %s, Valor: %dn", k, myMap[k])
}
}