In Go wordt de struct map altijd per waarde doorgegeven, maar deze waarde bevat een verwijzing naar de interne structuren van de map zelf (onder de motorkap — een hash-tabel). Dus als je een map naar een functie doorgeeft en de inhoud binnen de functie wijzigt (elementen toevoegt/verwijdert), zijn de wijzigingen zichtbaar van buitenaf. Slice gedraagt zich op de dezelfde manier — de struct slice wordt gekopieerd, maar niet de gegevensarray zelf: de slice bevat een verwijzing naar de array, de lengte en de capaciteit. Als je waarden op index binnen de functie wijzigt, wijzigt de oorspronkelijke array ook. Maar als je vanuit de functie een nieuwe slice toewijst (bijvoorbeeld een reslice), verandert de oorspronkelijke variabele niet.
func updateMap(m map[string]int) { m["key"] = 42 // Wijzigingen zijn zichtbaar van buitenaf! } func updateSlice(s []int) { s[0] = 99 // De oorspronkelijke array verandert }
Waarom weerspiegelen wijzigingen van de map en slice in een functie de "originele" waarden?
Antwoord: Omdat alleen de pointerstructuur wordt gekopieerd, terwijl de gegevens gemeenschappelijk blijven — elke wijziging raakt hetzelfde geheugenblok.
Verhaal
In een fintech-project gaven ze een map met configuratie-instellingen door aan verschillende services, in de veronderstelling dat lokale wijzigingen geen invloed zouden hebben op de gemeenschappelijke map. Als gevolg hiervan wijzigde één service de waarden, wat leidde tot bugs in andere modules die een onverwachte, gewijzigde configuratie ontvingen.
Verhaal
In een analytics microservice gaven ze een slice door, in de veronderstelling dat ze onafhankelijke kopieën zouden ontvangen. Maar de functie binnenin wijzigde waarden op index, wat leidde tot vervormde gegevens in het rapport, aangezien de oorspronkelijke array onverwacht gewijzigd was.
Verhaal
In game-servers gebruikten ze een map voor het opslaan van gebruikerssessies en gaven deze map tegelijkertijd door aan verschillende goroutines. Men veronderstelde dat elke goroutine met zijn eigen kopie werkte, maar in werkelijkheid ontstond er een raceconditie en gedeeltelijk verloren sessies.