Einbetten eines Zeigers auf eine Struktur vs. Einbetten der Struktur selbst
In dem gegebenen Szenario, in dem ein Strukturtyp A als verwendet wird Zeiger enthält und ausschließlich Zeigerempfänger enthält, gibt es einen Unterschied zwischen der Einbettung eines Strukturtyps B als B und *B.
Nullwertverhalten
Der offensichtlichste Unterschied liegt darin die Nullwerte der resultierenden Strukturen. Wenn B unverändert eingebettet wird, enthält der Nullwert vom Typ A ein eingebettetes Objekt vom Typ B, das ebenfalls seinen Nullwert enthält. Dies ermöglicht eine nahtlose Nutzung des eingebetteten Felds ohne vorherige Initialisierung:
type B struct { X int } func (b *B) Print() { fmt.Printf("%d\n", b.X) } type AObj struct { B } var aObj AObj aObj.Print() // prints 0
Andererseits führt die Einbettung von *B zu einem Nullwert mit einem Nullzeiger, wodurch ein direkter Feldzugriff verhindert wird:
type APtr struct { *B } var aPtr APtr aPtr.Print() // panics
Feldkopieren
Beim Erstellen neuer Objekte vom Typ A stimmt das Verhalten des Feldkopierens mit der Intuition überein. Durch die Einbettung von B wird direkt eine Kopie des eingebetteten Objekts innerhalb des neuen Objekts erstellt, wobei die Unabhängigkeit erhalten bleibt:
aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to a separate instance of B
Umgekehrt erstellt die Einbettung von *B eine Kopie des Zeigers und nicht des zugrunde liegenden konkreten Objekts. Dies bedeutet, dass beide Objekte dieselbe B-Instanz verwenden, was sich auf Feldänderungen auswirkt:
aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, as both objects point to the same B
Im Wesentlichen erstellt die Einbettung von B unterschiedliche Instanzen der enthaltenen Struktur, während die Einbettung von *B eine einzelne konkrete Instanz über mehrere eingebettete Strukturen hinweg gemeinsam nutzt . Diese Unterscheidung betrifft sowohl die Nullwertsemantik als auch das Verhalten beim Feldkopieren.
Das obige ist der detaillierte Inhalt vonWann sollte ein Zeiger auf eine Struktur im Vergleich zur Struktur selbst in Go eingebettet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!