Ich bin neu in Go und ich erlebe ein bisschen kongiffre Dissonanz zwischen C-style-Stack-basierte Programmierung, wo automatische Variablen auf dem Stapel leben und reservierte Speicherlevels auf dem Heap und Python-stack-based-Programmierung, wobei das einzige, was auf dem Stack lebt, Referenzen/Zeiger auf Objekte auf dem Heap sind.Stapel vs Heap Zuweisung von Strukturen in Go, und wie sie sich auf Garbage Collection beziehen
Soweit ich das beurteilen kann, geben die beiden folgenden Funktionen die gleiche Ausgabe:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
das heißt eine neue Struktur zuweisen und es zurück.
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 Heap zurückgeben, der zweite würde einen Zeiger auf den Stack zurückgeben, der zu der Zeit, zu der die Funktion zurückgekehrt wäre, verdampft wäre, was ein schlechtes Ding 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 bekomme, dass Go Garbage beide Werte sammelt, so sind beide der obigen Formen in Ordnung.
zu zitieren:
Beachten Sie, dass, anders als in C, es vollkommen in Ordnung ist, die Adresse eines lokalen Variablen zurückzukehren; Der mit der Variablen verknüpfte Speicher überlebt , nachdem die Funktion zurückgegeben wurde. In der Tat, die Adresse eines zusammengesetzten Literal nimmt eine neue Instanz jedes Mal zuweist, wenn es ausgewertet wird, so dass wir diese letzten zwei Zeilen kombinieren können.
Aber es wirft ein paar Fragen.
1 - In Beispiel 1 wird die Struktur auf dem Heap deklariert. Was ist mit Beispiel 2? Wird das auf dem Stapel genauso deklariert wie in C oder geht es auch auf den Haufen?
2 - Wenn Beispiel 2 auf dem Stack deklariert ist, wie bleibt es nach der Rückkehr der Funktion verfügbar?
3 - Wenn Beispiel 2 tatsächlich auf dem Heap deklariert ist, wie werden Strukturen nach Wert und nicht nach Referenz übergeben? Was ist der Sinn von Zeigern in diesem Fall?
Ausgezeichneter Dank. Ich fragte nicht wirklich "was ist der Sinn von Zeigern überhaupt?", Es war mehr wie "was ist der Sinn von Zeigern, wenn Werte sich wie Zeiger zu verhalten scheinen", und dieser Fall wird sowieso durch Ihre Antwort irrelevant gemacht. – Joe
Eine kurze Erklärung der Montage wäre willkommen. – ElefEnt