Dereferenzierung von Strukturen in Go: Erstellung neuer Kopien
Bei der Arbeit mit Strukturen in Go ist es wichtig, das Verhalten der Dereferenzierung zu verstehen. Durch die Dereferenzierung eines Objekts wird im Wesentlichen eine Kopie des Werts zurückgegeben, auf den es verweist. Dies kann für einige Programmierer aus anderen Sprachen kontraintuitiv sein, da die Dereferenzierung normalerweise das Objekt selbst zurückgibt.
Betrachten Sie das folgende Go-Code-Snippet:
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) return &p } func main() { p := study() fmt.Printf("&p.color = %p\n", &p.color) obj := *p fmt.Printf("&obj.color = %p\n", &obj.color) fmt.Printf("obj = %+v\n", obj) p.color = "purple" fmt.Printf("p.color = %p\n", &p.color) fmt.Printf("p = %+v\n", p) fmt.Printf("obj = %+v\n", obj) obj2 := *p fmt.Printf("obj2 = %+v\n", obj2) }
In diesem Beispiel ist die Studie() Die Funktion erstellt eine neue me-Struktur und gibt einen Zeiger darauf zurück. Diesen Zeiger weisen wir dann einer Variablen p zu. Wenn wir p dereferenzieren und es obj zuweisen, erstellen wir eine neue Kopie der Struktur. Diese neue Kopie hat eine andere Speicheradresse als die ursprüngliche Struktur, auf die p zeigt.
Das bedeutet, dass sich eine Änderung der Felder von obj nicht auf die Felder der ursprünglichen Struktur auswirkt und umgekehrt. Um einen Verweis auf die ursprüngliche Struktur zu erstellen, müssten wir den Zeiger von p auf obj zuweisen:
obj := p
In diesem Fall würden obj und p auf dieselbe Struktur verweisen und alle daran vorgenommenen Änderungen würden dies auch tun sich im anderen widerspiegeln.
Das obige ist der detaillierte Inhalt vonErstellt die Dereferenzierung einer Go-Struktur eine Kopie oder eine Referenz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!