Heim  >  Artikel  >  Backend-Entwicklung  >  Eingebettete Strukturen in Go: Wann sollte man nach Wert oder nach Zeiger einbetten?

Eingebettete Strukturen in Go: Wann sollte man nach Wert oder nach Zeiger einbetten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 19:34:30989Durchsuche

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

Eingebettete Strukturen in Go: Zeiger vs. Objekt

Verstehen Sie beim Umgang mit Zeigerempfängern und beim Erstellen von Zeigertypen den Unterschied zwischen dem Einbetten einer Struktur als Objekt (B) gegenüber einem Zeiger (*B) wird entscheidend. In diesem Zusammenhang unterscheiden sich die Nullwerte dieser beiden eingebetteten Strukturtypen erheblich.

Direkte Einbettung (Objekt)

Wenn eine Struktur B mit Zeigerempfängern direkt eingebettet wird als Ein Objekt innerhalb einer Struktur A, dessen Nullwert ein eingebettetes Objekt vom Typ B enthält, das selbst einen Nullwert hat. Entwickler können sicher auf dieses eingebettete Objekt und seine Methoden zugreifen.

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

Zeigereinbettung

Im Gegensatz dazu entsteht durch das Einbetten eines Zeigers auf B (*B) ein anderes Szenario . Der Nullwert dieser eingebetteten Struktur hat einen Nullzeigerwert, wodurch sie direkt unbrauchbar wird.

<code class="go">type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics</code>

Objektkopieren

Wenn ein AObj-Objekt erstellt wird, wird es erhalten eine Kopie des eingebetteten B-Objekts. An der Kopie vorgenommene Änderungen wirken sich nicht auf das Originalobjekt aus.

<code class="go">aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0</code>

Zeigerkopie

Mit APtr kopiert das Erstellen eines neuen Objekts den Zeiger (*B), aber nicht das zugrunde liegende konkrete Objekt, auf das gezeigt wird. Daher wirken sich Änderungen am neuen Objekt sowohl auf das Original als auch auf die neuen Objekte aus.

<code class="go">aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1</code>

Bei der Entscheidung, ob eine Struktur als Objekt oder Zeiger eingebettet werden soll, ist es wichtig, den spezifischen Anwendungsfall und die Anforderungen zu berücksichtigen. Diese Entscheidung kann sich unter anderem auf die Nullinitialisierung, das Kopierverhalten und den Objektbesitz auswirken.

Das obige ist der detaillierte Inhalt vonEingebettete Strukturen in Go: Wann sollte man nach Wert oder nach Zeiger einbetten?. 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