Stack vs. Heap-Zuweisung von Strukturen in Go und deren Beziehung zur Garbage Collection

Ich bin neu in Go und habe eine gewisse Dissonanz zwischen der Stapelprogrammierung im C-Stil, bei der automatische Variablen auf dem Stapel und zugeordneter Speicher auf dem Heap und der Stapelprogrammierung im Python-Stil gespeichert sind Das einzige, was auf dem Stapel lebt, sind Verweise / Zeiger auf Objekte auf dem Heap.

Soweit ich das beurteilen kann, geben die beiden folgenden Funktionen dieselbe Ausgabe aus:

func myFunction() (*MyStructType, error) {
    var chunk *MyStructType = new(HeaderChunk)

    ...

    return chunk, nil
}


func myFunction() (*MyStructType, error) {
    var chunk MyStructType

    ...

    return &chunk, nil
}

Zuweisen einer neuen Struktur und Zurückgeben derselben.

Wenn ich das in C geschrieben hätte, hätte der erste ein Objekt auf den Haufen gelegt und der zweite hätte es auf den Stapel gelegt. Der erste würde einen Zeiger auf den Haufen zurückgeben, der zweite würde einen Zeiger auf den Stapel zurückgeben, der zum Zeitpunkt der Rückkehr der Funktion verflogen wäre, was eine schlechte Sache wäre.

Wenn ich es in Python (oder vielen anderen modernen Sprachen außer C #) geschrieben hätte, wäre Beispiel 2 nicht möglich gewesen.

Ich verstehe, dass Go Garbage beide Werte sammelt, sodass beide oben genannten Formen in Ordnung sind.

Zitieren:

Beachten Sie, dass es im Gegensatz zu C vollkommen in Ordnung ist, die Adresse einer lokalen Variablen zurückzugeben. Der der Variablen zugeordnete Speicher bleibt nach der Rückkehr der Funktion erhalten. Tatsächlich wird durch die Verwendung der Adresse eines zusammengesetzten Literal bei jeder Auswertung eine neue Instanz zugewiesen, sodass wir diese beiden letzten Zeilen kombinieren können.

http://golang.org/doc/effective_go.html#functions

Aber es wirft ein paar Fragen auf.

1 - In Beispiel 1 wird die Struktur auf dem Heap deklariert. Was ist mit Beispiel 2? Wird das auf dem Stack genauso deklariert wie in C oder geht es auch auf den Haufen?

2 - Wenn Beispiel 2 im Stack deklariert ist, wie bleibt es verfügbar, nachdem die Funktion zurückgegeben wurde?

3 - Wenn Beispiel 2 tatsächlich auf dem Heap deklariert ist, wie kommt es dann, dass Strukturen als Wert und nicht als Referenz übergeben werden? Was ist der Sinn von Zeigern in diesem Fall?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage