Heim  >  Artikel  >  Backend-Entwicklung  >  Stack und Heap in Go verstehen: Eine einfache Anleitung

Stack und Heap in Go verstehen: Eine einfache Anleitung

Patricia Arquette
Patricia ArquetteOriginal
2024-10-14 06:20:02828Durchsuche

Understanding Stack and Heap in Go: A Simple Guide

Wenn Sie anfangen, Go oder eine andere Programmiersprache zu lernen, werden Sie oft von Stack- und Heap-Speicher hören. Diese beiden Speicherbereiche sind äußerst wichtig, um zu verstehen, wie Ihr Programm ausgeführt wird und Daten hinter den Kulissen verwaltet. Aber keine Sorge – heute erklären wir sie auf leicht verständliche Weise mit einer lustigen Wendung.

Was ist der Stapel?

Stellen Sie sich den Stapel wie einen ordentlichen Stapel Tabletts in einer Cafeteria vor. Jedes Mal, wenn jemand ein Tablett braucht, schnappt er sich eines von oben. Und wenn sie ein Tablett zurückgeben, legen sie es wieder oben auf den Stapel. Der Stack in Go funktioniert ähnlich!

  • Der Stack ist ein kleiner, superschneller Speicherbereich.
  • Es speichert Dinge wie Funktionsaufrufe und lokale Variablen (wie Ganzzahlen oder kleine Strukturen).
  • Jedes Mal, wenn eine Funktion aufgerufen wird, fügt Go oben im Stapel ein „Tray“ (Rahmen) hinzu. Wenn die Funktion beendet ist, wird das Fach von oben entfernt.

Der Stapel folgt also einem LIFO (Last In, First Out)-System, genau wie bei der Entnahme und Rückgabe von Tabletts.

Beispiel: Stack in Aktion
Nehmen wir an, wir haben diesen einfachen Go-Code:

func main() {
    greet("John")
}

func greet(name string) {
    message := "Hello, " + name
    fmt.Println(message)
}

Das passiert Schritt für Schritt:

  1. Go legt für die Hauptfunktion ein Tablett auf den Stapel.
  2. main ruft „greet()“ auf, daher wird ein weiteres Fach (Stapelrahmen) für „greet()“ hinzugefügt.
  3. Die Begrüßungsfunktion erstellt eine lokale variable Nachricht und Go platziert diese in der Taskleiste.
  4. Sobald „greet()“ abgeschlossen ist, wird das Fach vom Stapel entfernt.
  5. Schließlich, wenn das Hauptgericht fertig ist, wird das letzte Tablett entfernt.

Ordentlich und organisiert, oder? Der Stack eignet sich perfekt für den Umgang mit Dingen, die temporär sind und schnell verschwinden – wie lokale Variablen innerhalb von Funktionen.

Was ist der Haufen?

Stellen wir uns nun den Haufen als großen Spielplatz vor. Im Gegensatz zum Stapel, bei dem Sie Dinge nur von oben hinzufügen oder entfernen können, ähnelt der Haufen eher einer großen offenen Fläche, in der Sie Dinge überall ablegen können.

  • Der Heap ist ein viel größerer Speicherplatz.
  • Es wird zum Speichern von Daten verwendet, die auch nach Abschluss einer Funktion noch eine Weile erhalten bleiben müssen.
  • Dinge, die auf dem Heap gespeichert sind, haben keine bestimmte Reihenfolge und Go muss sie mithilfe von sogenannten Zeigern verfolgen.

Obwohl der Heap groß ist und mehr Daten speichern kann, ist der Zugriff auf ihn langsamer als auf den Stack, da Go herausfinden muss, wo sich die Dinge befinden, und anschließend aufräumen muss. Go verfügt über einen Garbage Collector, der ungenutzten Heap-Speicher automatisch aufräumt, genau wie jemand, der den Spielplatz aufkehrt.

Beispiel: Heap in Aktion
Schauen Sie sich diesen Go-Code an:

func main() {
    user := newUser("Alice")
    fmt.Println(user.name)
}

func newUser(name string) *User {
    user := &User{name: name}
    return user
}

type User struct {
    name string
}

So kommt der Haufen ins Spiel:

  1. main ruft newUser() auf.
  2. Innerhalb von newUser erstellen wir eine neue Benutzerstruktur mit dem Namensfeld.
  3. Go beschließt, diese Struktur auf dem Heap und nicht auf dem Stapel zu speichern, da sie nach der Rückkehr von newUser bestehen bleiben muss.
  4. Go gibt uns einen Zeiger (wie eine Karte darauf, wo sich die Struktur im Speicher befindet) und gibt ihn an main zurück.
  5. Auch nachdem newUser fertig ist, bleibt die User-Struktur im Speicher (auf dem Heap) und main kann immer noch mit dem Zeiger darauf zugreifen.

Der Heap ist nützlich, wenn Sie Daten speichern müssen, die die Funktion, in der sie erstellt wurden, überdauern, aber er ist etwas langsamer und erfordert eine sorgfältige Verwaltung durch den Garbage Collector von Go.

Stack vs. Heap: Was ist der Unterschied?

  • Stack ist wie ein Tablettstapel: klein, schnell und temporär. Perfekt für lokale Variablen innerhalb von Funktionen.

  • Heap ist wie ein Spielplatz: groß, flexibler, aber langsamer. Wird für Dinge verwendet, die länger leben müssen (z. B. Objekte, die funktionsübergreifend gemeinsam genutzt werden müssen).

Abschluss

Das Verständnis des Unterschieds zwischen Stack und Heap ist der Schlüssel zum Schreiben effizienter Go-Programme. Der Stack ist schnell und einfach zu verwalten und eignet sich hervorragend für temporäre Daten. Der Haufen ist größer, aber langsamer und wird verwendet, wenn Sie etwas zum Festhalten benötigen.

Go übernimmt mit der automatischen Speicherverwaltung einen Großteil der Komplexität für Sie, aber wenn Sie diese Konzepte kennen, können Sie optimierteren und effizienteren Code schreiben.

Viel Spaß beim Codieren!

Das obige ist der detaillierte Inhalt vonStack und Heap in Go verstehen: Eine einfache Anleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn