Go ist eine Sprache, die oft als einfach und schnell bezeichnet wird. Aber unter der Haube macht es eine Menge Magie, besonders wenn es um die Arbeit mit dem Gedächtnis geht. Wenn Sie verstehen, wo und wie Daten gespeichert werden, können Sie effizienteren Code schreiben, unnötige Zuweisungen vermeiden und das Programmverhalten besser verstehen.
Stack und Heap: Grundlagen
Stapel (stack) - Speicher, der nach dem LIFO-Prinzip (last in, first out) arbeitet. Variablen bleiben bis zum Verlassen der Funktion bestehen. Die Arbeit mit dem Stack ist schnell und fast kostenlos.
Haufen (heap) - Speicherbereich für Objekte, deren Lebensdauer nicht im Voraus bestimmt werden kann. Wird von einem Garbage Collector (GC) verwaltet. Die Zuweisungen sind teurer und die Sammlung kann das Programm verlangsamen.
Der Hauptunterschied: auf dem Stack wird der Speicher beim Verlassen der Funktion automatisch freigegeben, und im Heap überwacht GC dies.
Fluchtanalyse: Wer ist in die Menge geflohen?
Wenn der Go-Compiler auf eine Variable trifft, entscheidet er, wo er sie speichern soll - im Stack oder im Heap. Dieser Prozess heißt escape analysis.
Wenn eine Variable außerhalb der Funktion "läuft", wird sie in den Heap verschoben. Wenn nicht, bleibt es im Stack.
Beispiel 1. Lokale Variable (bleibt im Stack)
func sum(a, b int) int {
c := a + b
return c
}
Beispiel 2. Die Variable geht in den Stack
func makePointer() *int {
x := 42
return &x
}
Hier wird x durch den Zeiger zurückgegeben. Nach dem Verlassen der Funktion wird der Stack gelöscht und der Wert geht verloren. Daher „läuft“ x in den Heap, um weiterzuleben.

Wir überprüfen die Escape-Analyse
go build -gcflags="-m" main.go
Beispiel für die Ausgabe:
./main.go:5:6: moved to heap: x
Wann laufen die Variablen in einem Haufen zusammen?
Rückgabe aus der Funktion durch Zeiger.
Bleiben geschlossen.
Werden an die Schnittstelle übertragen (manchmal).
Die Größe der Struktur ist zu groß, um in den Stack zu passen.
Beispiel 3. Kurzschluss
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
Hier wird sum im Stack gespeichert, weil es länger als die Funktion adder leben muss.
Stack vs. Heap in der Praxis
Eigenschaft | Stapel | Haufen |
|---|---|---|
Lebenszeit | Während die Funktion ausgeführt wird | Vor der GC-Montage |
Zugriffsgeschwindigkeit | Sehr schnell | Langsamer |
Steuerung | Automatisch | Müllsammler |
Wo werden sie gespeichert? | Lokale Variablen | Zeiger, Loops, langlebige Objekte |
Wie man effektiven Code schreibt
Vermeiden Sie unnötige Zeiger. Je mehr Wegweiser, desto größer ist die Chance, sich zu verirren.
Verwenden Sie nach Möglichkeit Werte anstelle von Links.
Beobachten Sie die Escape-Analyse. Manchmal weist Go Speicher im Heap zu, obwohl dies nicht erforderlich zu sein scheint.
Scheuen Sie sich nicht vor zu vielen. Optimierung ist wichtig, aber vorzeitige Optimierung ist schlecht.
Ergebnis
Wenn Sie verstehen, wo Daten in Go gespeichert werden, können Sie produktiveren Code schreiben. Escape analysis ist ein Werkzeug, das das Schicksal jeder Variablen entscheidet. Und wenn Sie seine Regeln kennen, können Sie unerwartete Bremsen aufgrund unnötiger Zuweisungen im Stapel vermeiden.
In Kodike Es gibt einen vollständigen Kurs in Go - von den Grundlagen bis zu fortgeschrittenen Themen. Wir analysieren Syntax, Arbeit mit Speicher, Wettbewerbsfähigkeit und schreiben Miniprojekte, die helfen, Wissen zu festigen.
Und wir haben auch einen aktiven Telegram-Kanal, wo wir coole Ideen diskutieren, Erfahrungen teilen und Aufgaben gemeinsam analysieren — Lernen wird nicht nur nützlich, sondern auch unterhaltsam.
