Struktur oder Zeiger in Struktur als Zeiger einbetten: Hauptunterschiede
Wenn ein Strukturtyp A als Zeiger mit nur Zeigerempfängern und Konstruktoren fungiert A zurückgeben, einen anderen Strukturtyp B einbetten bietet zwei Optionen: B direkt einbetten oder B einbetten.
Nullwertunterschiede:
Die Nullwerte von A mit eingebettetem B gegenüber eingebettetem *B unterscheiden sich. Wenn B direkt eingebettet ist, enthält der Nullwert von A einen eingebetteten Nullwert von B, was eine sichere Verwendung ohne Initialisierung ermöglicht:
<code class="go">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</code>
Die Einbettung eines Nullzeigerwerts in den Nullwert von APtr macht jedoch eine direkte Verwendung unmöglich:
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // panics</code>
Objektkopieren:
Objekte werden wie erwartet kopiert. Das Erstellen eines neuen AObj kopiert das eingebettete B:
<code class="go">aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to the copy</code>
Umgekehrt kopiert das Erstellen eines neuen APtr das *B und behält das gemeinsame konkrete Objekt bei:
<code class="go">aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, due to shared reference</code>
Beispiel:
https://play.golang.org/p/XmOgegwVFeE bietet ein ausführbares Beispiel, das diese Unterschiede demonstriert.
Das obige ist der detaillierte Inhalt vonEinbetten einer Struktur oder eines Zeigers auf eine Struktur: Wann und warum?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!