Programmiersprachen weisen Objekte im Speicher zu und anders Sprachen verwenden dazu unterschiedliche Strategien. In C befinden sich vom Stapel zugewiesene Variablen auf dem Stapel, während der vom Heap zugewiesene Speicher dynamisch zugewiesen wird. Python hingegen weist alle Objekte auf dem Heap zu und verwendet Referenzen, um auf sie zuzugreifen.
Gos Ansatz zur Speicherzuweisung unterscheidet sich sowohl von C als auch von Python. Während Go nicht explizit angibt, wo Objekte zugewiesen werden, nutzt es Garbage Collection, um ungenutzten Speicher zurückzugewinnen. Dies wirft Fragen darüber auf, wie Strukturen, bei denen es sich um zusammengesetzte Typen handelt, in Go zugewiesen werden.
Betrachten Sie die folgenden zwei Funktionen, die scheinbar dieselbe Aufgabe ausführen:
func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil }
Diese Beispielfunktionen werfen mehrere auf Fragen:
In Go wird der Stapel zum Speichern von Funktionsargumenten, lokalen Variablen usw. verwendet Rückgabewerte. Der Heap wird zum Zuweisen von Objekten verwendet, die mit „new“ erstellt wurden oder die dem Stapel entkommen sind.
In der ersten Funktion wird ein Chunk mit „new“ auf dem Heap zugewiesen. In der zweiten Funktion bestimmt die Escape-Analyse von Go, dass &chunk dem Stapel entkommt, sodass er auch auf dem Heap zugewiesen wird.
Auch wenn Chunk im Stapel auf dem Stapel zugewiesen wird Als zweite Funktion stellt der Garbage Collector von Go sicher, dass darauf zugegriffen werden kann, nachdem die Funktion zurückgekehrt ist. Dies liegt daran, dass die Escape-Analyse feststellt, dass dieser Block den Funktionsumfang verlässt, und der Garbage Collector ihn nicht zurückgewinnen wird, solange er von einem anderen Objekt referenziert wird.
Strukturen werden übergeben nach Wert in Go, da es sich um zusammengesetzte Typen handelt. Die Übergabe eines Zeigers würde es dem Aufgerufenen stattdessen ermöglichen, die ursprüngliche Struktur zu ändern. Im Fall der zweiten Funktion wird Chunk auf dem Heap zugewiesen, sodass kein Zeiger darauf übergeben werden muss. Zeiger werden jedoch verwendet, wenn der Aufrufer auf eine Struktur zugreifen muss, die auf dem Heap zugewiesen wurde.
Das obige ist der detaillierte Inhalt vonWie geht Go mit der Stack- und Heap-Zuweisung von Strukturen um und welche Rolle spielt die Garbage Collection?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!