Heim >Backend-Entwicklung >Golang >Erstellt die Dereferenzierung einer Go-Struktur eine neue Kopie?
Erstellt die Dereferenzierung einer Struktur eine neue Kopie in Go?
In Go, wenn eine Variable eines Strukturtyps per Referenz mit übergeben wird Wenn Sie den Sternchen (*)-Operator verwenden, kann es zu der falschen Annahme kommen, dass die dereferenzierte Variable dieselbe Adresse wie das Original darstellt struct.
Wie jedoch im angegebenen Codeausschnitt gezeigt:
package main import ( "fmt" ) type me struct { color string total int } func study() *me { p := me{} p.color = "tomato" fmt.Printf("%p\n", &p.color) // Address of p.color return &p } func main() { p := study() // p is a pointer to a struct fmt.Printf("&p.color = %p\n", &p.color) // Address of p.color obj := *p // obj is a copy of the struct pointed to by p fmt.Printf("&obj.color = %p\n", &obj.color) // Address of obj.color fmt.Printf("obj = %+v\n", obj) p.color = "purple" // Changes color of the struct pointed by p fmt.Printf("p.color = %p\n", &p.color) fmt.Printf("p = %+v\n", p) fmt.Printf("obj = %+v\n", obj) obj2 := *p // Another copy is made fmt.Printf("obj2 = %+v\n", obj2) }
Wenn wir diesen Code ausführen, zeigt die Ausgabe, dass die dereferenzierte Variable obj eine andere Adresse als die ursprüngliche Struktur p hat . Dies liegt daran:
Dereferenzierung erstellt eine neue Kopie:
Die Zeile obj := *p erstellt eine neue Variable obj vom gleichen Typ wie p (me), und initialisiert es mit einer Kopie des Werts, auf den p zeigt. Dies bedeutet, dass alle an obj vorgenommenen Änderungen keinen Einfluss auf die ursprüngliche Struktur haben.
Effektive Zuweisung eines neuen Strukturwerts zu einer anderen:
Ähnlich wie var obj me = *p , weist die Dereferenzierungsoperation in obj := *p der Variablen obj einen neuen Strukturwert zu. Dadurch wird eine neue Kopie mit separatem Speicher erstellt.
Verwenden Sie den Sternchenoperator mit Vorsicht:
Während der Sternchenoperator Zeigersemantik bereitstellt, ist es wichtig, seine Auswirkungen auf Variablen zu verstehen . Wenn ein Wert mit dem Operator * (Dereferenzierung) zugewiesen wird, wird eine neue Kopie erstellt, kein neuer Verweis auf die ursprüngliche Variable.
Das obige ist der detaillierte Inhalt vonErstellt die Dereferenzierung einer Go-Struktur eine neue Kopie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!