Heim  >  Artikel  >  Backend-Entwicklung  >  Wann sollte ein Zeiger auf eine Struktur im Vergleich zur Struktur selbst in Go eingebettet werden?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 08:27:30751Durchsuche

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

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!

Stellungnahme:
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