„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 04.11.2024
Durchsuche:423

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.

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

Zeigereinbettung

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

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

Object Copying

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

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0

Zeigerkopie

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

aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1

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

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3