Go-Dereferenzierung: Kopien oder nicht, das ist hier die Frage
Beim Zugriff auf eine Go-Struktur mit dem Dereferenzierungsoperator (*) können Benutzer möglicherweise Ich frage mich, ob das Ergebnis eine neue Kopie der Struktur oder ein Verweis auf das Originalobjekt ist.
Verstehen des Verhalten
Im bereitgestellten Codeausschnitt:
type me struct { color string total int } func study() *me { p := me{} return &p } obj := *study()
study() gibt einen Zeiger auf eine me-Struktur zurück. Durch die Dereferenzierung in obj wird eine Kopie der Struktur erstellt. Dies geht aus den unterschiedlichen Speicheradressen von &p.color und &obj.color hervor.
Man könnte erwarten, dass die dereferenzierte Struktur obj dieselbe Speicheradresse wie die ursprüngliche Struktur hat, aber das ist in nicht der Fall dieser Instanz. Dieses Verhalten kann auf Gos automatische Freigabe von Variablen am Ende ihres Gültigkeitsbereichs zurückgeführt werden.
Wenn es sich tatsächlich um eine Referenz handelt
Um ein Referenzverhalten zu erreichen, kann man a zuweisen Zeiger direkt auf die Struktur mit:
obj := study()
In diesem Fall ist obj ein Zeiger auf die ursprüngliche me-Struktur und ändert sich in eine davon p oder obj wirken sich auf dieselbe zugrunde liegende Struktur aus.
Schlussfolgerung
Beim Dereferenzieren einer Struktur in Go ist es wichtig zu verstehen, dass das Ergebnis eine Kopie der ursprünglichen Struktur ist es sei denn, ein Zeiger auf die Struktur wird explizit zugewiesen. Dieses Verhalten stellt sicher, dass an der dereferenzierten Struktur vorgenommene Änderungen keine Auswirkungen auf die ursprüngliche Struktur haben, wodurch die Kapselung und Variablenunabhängigkeit gewahrt bleibt.
Das obige ist der detaillierte Inhalt vonErstellt der Dereferenzierungsoperator von Go eine Kopie oder einen Verweis auf die Originalstruktur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!