Go Programming

Dominando a Iteração de Mapas em Go

Spread the love

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

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

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *