Hoe werkt het datatype Map in Go?
sobes.tech AI
Antwoord van AI
Map — is een ongeordende verzameling van "sleutel-waarde" paren in Go.
Kenmerken:
- Sleutels moeten vergelijkbare datatypes zijn (getallen, strings, booleans, pointers, kanalen, interfaces, als het dynamische type vergelijkbaar is, en arrays als hun elementen vergelijkbaar zijn). Slices, functies en andere maps kunnen niet als sleutels worden gebruikt.
- Waarden kunnen van elk datatype zijn.
- Map is een referentietype, wat betekent dat een variabele van het type map een pointer bevat naar de datastructuur map in het geheugen. Wijzigingen aan de map via één variabele zijn zichtbaar via andere variabelen die naar dezelfde map verwijzen.
- De nulwaarde voor een map is
nil. Je kunt niet schrijven in eennilmap; een poging daartoe veroorzaakt een panic. - De grootte van de map verandert dynamisch naarmate er elementen worden toegevoegd of verwijderd.
Interne implementatie: Map in Go wordt geïmplementeerd als een hash-tabel. Elke sleutel wordt gehasht, en het resultaat van de hash wordt gebruikt om de positie van de bijbehorende waarde in de tabel te bepalen.
// Map maken
m := make(map[string]int)
// Elementen toevoegen
m["een"] = 1
m["twee"] = 2
// Waarde ophalen
value, ok := m["een"] // value = 1, ok = true
value, ok = m["drie"] // value = 0 (nulwaarde voor int), ok = false
// Element verwijderen
delete(m, "twee")
// Iteratie over map (volgorde niet gegarandeerd)
for key, value := range m {
// ...
}
Vergelijking van maps: Twee maps worden als gelijk beschouwd alleen als ze naar dezelfde interne structuur verwijzen, dat wil zeggen, map1 == map2 alleen als map1 en map2 dezelfde variabele zijn. Het is niet toegestaan om de inhoud van een map te vergelijken met ==. Om de inhoud te vergelijken, moet je over beide maps itereren en hun elementen vergelijken.
Prestaties: Toegang, toevoegen en verwijderen in een map hebben gemiddeld O(1) complexiteit. In het slechtste geval (bijvoorbeeld bij veel hash-collisies) kunnen ze O(n) tijd kosten.