Wann sollte ein Zeiger auf eine Struktur im Vergleich zur Struktur selbst in Go eingebettet werden?

Mary-Kate Olsen
Freigeben: 2024-11-03 08:27:30
Original
772 Leute haben es durchsucht

When to Embed a Pointer to a Struct vs. the Struct Itself in Go?

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage