Struktur dereferenzieren: Wertkopie vs. Referenzzuweisung verstehen
Beim Arbeiten mit Strukturen in Go kann der Sternchenoperator (*) verwendet werden um einen Strukturzeiger zu dereferenzieren, was die Frage aufwirft, ob er denselben Strukturwert oder eine neue Kopie zurückgibt. Lassen Sie uns dies anhand eines Beispiels verdeutlichen:
Betrachten Sie den folgenden Code:
type me struct { color string total int } func study() *me { p := me{} p.color = "tomato" return &p }
In diesem Fall gibt die Funktion Study() einen Zeiger auf eine me-Struktur zurück. Wenn wir Study() in der Hauptfunktion aufrufen und p zuweisen, speichern wir im Wesentlichen einen Verweis auf die ursprüngliche me-Struktur. Wenn wir jedoch p mit obj := *p dereferenzieren, kopieren wir den Wert der Struktur, auf die p zeigt. Dies entspricht:
var obj me = *p
Als Ergebnis wird obj zu einer neuen Variablen vom Typ me, die mit denselben Daten initialisiert wird wie die Struktur, auf die p zeigt. Das bedeutet, dass obj und p separate Speicheradressen haben, auch wenn sie dieselben Daten enthalten.
Es ist wichtig zu beachten, dass sich Änderungen an der Objektstruktur nicht auf die Daten auswirken, auf die p zeigt , es sei denn, die me-Struktur enthält Referenztypen (z. B. Slices, Maps oder Kanäle). In solchen Fällen werden Änderungen an diesen Feldern sowohl in obj als auch in der Struktur, auf die p zeigt, widergespiegelt.
Wenn wir jedoch derselben Struktur wie p eine Referenz zuweisen möchten, anstatt ihren Wert zu kopieren, Wir können eine direkte Zuweisung verwenden:
obj := p
In diesem Fall enthält obj einen direkten Verweis auf dieselbe Struktur wie p, und alle an obj vorgenommenen Änderungen werden auch durch sichtbar sein S.
Das obige ist der detaillierte Inhalt vonGo Structs: Wertkopie oder Referenz beim Dereferenzieren eines Zeigers?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!