ProgrammierungBackend-Entwickler

Erzählen Sie, wie Go den Umgang mit dem Speicher bei der Übertragung von map und slice in Funktionen implementiert und welche Risiken damit verbunden sein können?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In Go wird die Struktur map immer durch Wertübergabe übertragen, aber dieser Wert enthält einen Zeiger auf die internen Strukturen der map (unter der Haube — Hash-Tabelle). Daher, wenn Sie eine map an eine Funktion übergeben und innerhalb der Funktion den Inhalt ändern (Elemente hinzufügen/entfernen), werden die Änderungen von außen sichtbar sein. Ähnlich verhält es sich mit slice — die Struktur des slice wird kopiert, aber nicht das eigentliche Array/Daten: das slice enthält einen Zeiger auf das Array, die Länge und die Kapazität. Wenn Sie Werte nach Index innerhalb der Funktion ändern, wird das ursprüngliche Array ebenfalls geändert. Aber wenn Sie aus der Funktion einen neuen slice zuweisen (zum Beispiel reslice), wird die ursprüngliche Variable nicht geändert.

func updateMap(m map[string]int) { m["key"] = 42 // Änderungen sind von außen sichtbar! } func updateSlice(s []int) { s[0] = 99 // Das ursprüngliche Array wird geändert }

Fangfrage.

Warum spiegeln Änderungen von map und slice in der Funktion die "Originale" wider?

Antwort: Weil nur die Struktur des Zeigers kopiert wird, während die Daten selbst gemeinsam bleiben — alle Änderungen betreffen denselben Speicherblock.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

In einem Fintech-Projekt wurde eine map mit Konfigurationseinstellungen an verschiedene Dienste übergeben, wobei angenommen wurde, dass lokale Änderungen keinen Einfluss auf die gemeinsame map haben. Infolgedessen änderte ein Dienst die Werte, was zu Fehlern in anderen Modulen führte, die eine unerwartet geänderte Konfiguration erhielten.


Geschichte

In einem Analyse-Mikroservice wurde ein slice übergeben, in der Annahme, unabhängige Kopien zu erhalten. Aber die Funktion innerhalb änderte die Werte nach Index, was zu verfälschten Daten im Bericht führte, da das ursprüngliche Array unerwartet geändert wurde.


Geschichte

In Spieleservern wurde eine map zur Speicherung von Benutzersitzungen verwendet und diese map parallel an mehrere Goroutinen übergeben. Es wurde angenommen, dass jede Goroutine mit ihrer eigenen Kopie arbeitet, aber tatsächlich kam es zu einem Datenrennen und teilweise verlorenen Sitzungen.