Pointer- vs. Value-Receiver
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 8 von 107.
Methoden können entweder einen Value-Receiver oder einen Pointer-Receiver haben. Ein Value-Receiver arbeitet mit einer Kopie der Struktur. Ein Pointer-Receiver arbeitet mit der ursprünglichen Struktur und kann deren Felder ändern.
Wertempfänger: arbeitet mit einer Kopie
type Counter struct {
Count int
}
func (c Counter) GetCount() int {
return c.Count
}
// Dies ändert das Original NICHT
func (c Counter) IncrementWrong() {
c.Count++ // Ändert nur die Kopie!
}Pointer-Receiver: ändert das original
// Dies ÄNDERT das Original
func (c *Counter) Increment() {
c.Count++
}
func (c *Counter) Reset() {
c.Count = 0
}Beides zusammen verwenden
func main() {
counter := Counter{Count: 0}
counter.Increment()
counter.Increment()
fmt.Println(counter.GetCount()) // Ausgabe: 2
counter.Reset()
fmt.Println(counter.GetCount()) // Ausgabe: 0
}Verwende einen Werte-Receiver, wenn die Methode nur Daten liest. Verwende einen Pointer-Receiver (*StructName), wenn die Methode die Felder der Struktur ändern muss. Go übernimmt die Referenzierung automatisch. Du rufst beide auf dieselbe Weise auf.
Aufgabe
MittelFüge der Struktur Wallet Methoden mit den korrekten Empfängertypen hinzu:
GetBalance: Wertempfänger, gibt den aktuellen Kontostand zurückDeposit: Zeigerempfänger, addiert den Betrag zum KontostandWithdraw: Zeigerempfänger, zieht den Betrag nur ab, wenn ausreichende Mittel vorhanden sind
Probier es selbst
package main
import "fmt"
func main() {
var balance, deposit, withdraw float64
fmt.Scan(&balance, &deposit, &withdraw)
w := Wallet{Balance: balance}
fmt.Printf("Balance: %.2f\n", w.GetBalance())
w.Deposit(deposit)
fmt.Printf("After deposit: %.2f\n", w.GetBalance())
w.Withdraw(withdraw)
fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())
fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler