Sobes.tech
Junior

Como funciona o tipo de dado Map em Go?

sobes.tech IA

Resposta da IA

Map — é uma coleção não ordenada de pares "chave-valor" em Go.

Características:

  • As chaves devem ser tipos de dados comparáveis (números, strings, booleanos, ponteiros, canais, interfaces, se o tipo dinâmico for comparável, e arrays se seus elementos forem comparáveis). Slices, funções e outros maps não podem ser usados como chaves.
  • Os valores podem ser de qualquer tipo de dado.
  • Map é um tipo de referência, o que significa que uma variável do tipo map contém um ponteiro para a estrutura de dados map na memória. Alterar o map através de uma variável será visível através de outras variáveis que referenciam o mesmo map.
  • O valor nulo para um map é nil. Não é possível escrever em um map nil; tentar fazê-lo provocará um pânico.
  • O tamanho do map muda dinamicamente à medida que elementos são adicionados ou removidos.

Implementação interna: Map em Go é implementado como uma tabela de hash (hash table). Cada chave é hasheada, e o resultado do hash é usado para determinar a posição do valor associado na tabela.

// Criar um map
m := make(map[string]int)

// Adicionar elementos
m["um"] = 1
m["dois"] = 2

// Obter um valor
value, ok := m["um"] // value = 1, ok = true
value, ok = m["três"]  // value = 0 (valor zero para int), ok = false

// Remover um elemento
delete(m, "dois")

// Iterar sobre o map (a ordem não é garantida)
for key, value := range m {
	// ...
}

Comparação de maps: Dois maps são considerados iguais apenas se eles fazem referência à mesma estrutura interna, ou seja, map1 == map2 apenas se map1 e map2 forem a mesma variável. Não é possível comparar o conteúdo de um map usando ==. Para comparar o conteúdo, é necessário iterar sobre ambos os maps e comparar seus elementos.

Desempenho: As operações de acesso, adição e remoção em um map têm, em média, complexidade O(1). No pior caso (por exemplo, com muitas colisões de hash), podem levar O(n) em tempo.