Strukturen in Go dereferenzieren: Kopieren vs. Referenzieren aufdecken
In Go scheint die Dereferenzierung einer Struktur mit dem *-Operator eine neue Struktur zurückzugeben Kopie der Struktur anstelle der Originaladresse. Dies kann zu Missverständnissen führen.
Bedenken Sie den folgenden Code:
type me struct { color string total int }
In diesem Code definieren wir eine Struktur namens me.
Innerhalb der Studienfunktion erstellen wir a me struct p und initialisiere sein Farbfeld. Anschließend geben wir die Adresse von p mit &p zurück.
func study() *me { p := me{} p.color = "tomato" return &p }
In der Hauptfunktion erhalten wir die Adresse von p.color und speichern sie in &p.color. Dann dereferenzieren wir p und speichern das Ergebnis in obj.
func main() { p := study() obj := *p }
Nun untersuchen wir die Ausgabe:
&p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color!
Wenn wir &p.color und &obj.color vergleichen, stellen wir fest, dass Sie haben unterschiedliche Adressen. Dies könnte darauf hindeuten, dass wir beim Dereferenzieren von p eine neue Kopie der Struktur erstellen.
Dies ist jedoch nicht der Fall. Wenn wir *p verwenden, kopieren wir den Wert der Struktur, auf die p zeigt. Es entspricht der Verwendung von:
var obj me = *p
obj ist eine neue Variable vom Typ me, initialisiert auf den Wert von *p. Dies führt dazu, dass obj eine separate Speicheradresse hat.
Es ist wichtig zu beachten, dass obj vom Typ „me“ ist, während p vom Typ „*me“ ist. Es sind unterschiedliche Werte. Das Ändern der obj-Felder hat keine Auswirkungen auf die Felder in p.
Wenn wir die ursprüngliche Struktur ändern möchten, können wir Folgendes verwenden:
obj := p // equivalent to: var obj *me = p
In diesem Fall zeigt obj auf dasselbe Objekt wie p. Sie haben unterschiedliche Adressen, enthalten aber dieselbe Adresse im eigentlichen Ich-Objekt.
Das obige ist der detaillierte Inhalt vonGo Structs: Erstellt die Dereferenzierung eine Kopie oder eine Referenz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!