Sobes.tech
Junior — Middle

Waarom is de volgorde van elementen niet gegarandeerd en lijkt deze willekeurig bij gebruik van map?

sobes.tech AI

Antwoord van AI

In Go wordt de ingebouwde structuur map geïmplementeerd met behulp van een hashtabel, en de volgorde van het doorlopen van de elementen is niet gegarandeerd en kan tussen iteraties veranderen. Dit komt doordat:

  • De hashfunctie de sleutels verdeelt over buckets, en de volgorde van de buckets niet vast is.
  • Voor veiligheid en om afhankelijkheid van de volgorde te voorkomen, wordt vanaf Go 1.0 de volgorde van het doorlopen van de map specifiek bij elke iteratie gerandomiseerd.

Daarom lijkt de volgorde van elementen bij het doorlopen van een map willekeurig en mag deze niet worden gebruikt in de programmalogica. Als een gesorteerde uitvoer nodig is, moeten de sleutels apart worden gesorteerd:

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

Op deze manier krijg je de elementen in gesorteerde volgorde.