Sobes.tech
Junior — Middle

Por que, ao usar map, a ordem dos elementos não é garantida e parece aleatória?

sobes.tech IA

Resposta da IA

No Go, a estrutura incorporada map é implementada usando uma tabela de dispersão, e a ordem de percorrer os elementos não é garantida e pode mudar entre iterações. Isto deve-se a:

  • A função hash distribui as chaves pelos baldes, e a ordem dos baldes não é fixa.
  • Para segurança e para evitar dependência da ordem, a partir do Go 1.0, a ordem de percorrer o map é especificamente aleatorizada em cada iteração.

Portanto, ao percorrer um map, a ordem dos elementos parece aleatória e não deve ser usada na lógica do programa. Se for necessária uma saída ordenada, deve-se ordenar as chaves separadamente:

m := map[string]int{"b": 2, "a": 1, "c": 3}
keys := make([]string, 0, len(m))
for k := range m {
    keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
    fmt.Println(k, m[k])
}

Assim, obterá os elementos em ordem ordenada.