ProgrammatieBackend ontwikkelaar

Vertel hoe Go het geheugen beheert bij het doorgeven van map en slice naar functies, en wat de mogelijke gevolgen hiervan zijn?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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 }

Vraag met een valkuil.

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.

Voorbeelden van echte fouten door onwetendheid over de nuances van dit onderwerp.


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.