Alokacja struktury stosu w sterty w Go i ich powiązanie z usuwaniem śmieci

Jestem nowym użytkownikiem Go i doświadczam niewielkiego dysonansu kongijnego między programowaniem opartym na stosie w stylu C, gdzie zmienne automatyczne działają na stosie, a przydzielona pamięć żyje na sterty i programowaniu opartym na stosie w stylu Pythona, gdzie Jedyną rzeczą, która żyje na stosie, są odwołania / wskaźniki do obiektów na stercie.

O ile wiem, dwie następujące funkcje dają ten sam wynik:

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

    ...

    return chunk, nil
}


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

    ...

    return &chunk, nil
}

tj. przydziel nową strukturę i zwróć ją.

Gdybym napisał, że w C, pierwszy umieściłby obiekt na stercie, a drugi umieściłby go na stosie. Pierwszy zwróci wskaźnik do sterty, drugi zwróci wskaźnik do stosu, który odparowałby do czasu powrotu funkcji, co byłoby Bad Thing.

Gdybym to napisał w Pythonie (lub wielu innych współczesnych językach z wyjątkiem C #), przykład 2 nie byłby możliwy.

Dostaję, że Go garbage zbiera obie wartości, więc obie powyższe formy są w porządku.

Cytować:

Zauważ, że w przeciwieństwie do C, zwracanie adresu zmiennej lokalnej jest całkowicie OK; pamięć powiązana ze zmienną przetrwa po zwróceniu funkcji. W rzeczywistości, przyjęcie adresu literału złożonego przydziela nową instancję za każdym razem, gdy jest ona oceniana, więc możemy połączyć te dwie ostatnie linie.

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

Ale rodzi to kilka pytań.

1 - W przykładzie 1 struktura jest zadeklarowana na stercie. A co z przykładem 2? Czy jest to zadeklarowane na stosie w taki sam sposób, w jaki byłby w C, czy też na stosie?

2 - Jeśli przykład 2 jest zadeklarowany na stosie, w jaki sposób pozostaje dostępny po zwróceniu funkcji?

3 - Jeśli przykład 2 jest faktycznie zadeklarowany na stercie, jak to się dzieje, że struktury są przekazywane przez wartość, a nie przez odniesienie? Jaki jest sens wskaźników w tym przypadku?

questionAnswers(4)

yourAnswerToTheQuestion