Pointer Receiver
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 8 von 68.
Während Value-Receiver mit Kopien von Structs arbeiten, arbeiten Pointer-Receiver direkt mit der ursprünglichen Struct-Instanz. Wenn Sie eine Methode mit einem Pointer-Receiver definieren, kann die Methode die ursprünglichen Daten ändern, da sie einen Pointer auf das Struct anstelle einer Kopie erhält.
Um einen Pointer-Receiver zu erstellen, fügen Sie ein Sternchen * vor dem Typnamen in der Receiver-Deklaration hinzu:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // Dies modifiziert das ursprüngliche Struct
}In diesem Beispiel ist (p *Person) ein Pointer-Receiver. Wenn Sie die Methode haveBirthday auf einer Person-Instanz aufrufen, erhält die Methode einen Pointer auf das ursprüngliche Struct. Alle Änderungen, die über diesen Pointer an den Struct-Feldern vorgenommen werden, modifizieren die ursprünglichen Daten dauerhaft.
Pointer-Receiver sind unerlässlich, wenn Ihre Methoden die Felder des Structs aktualisieren müssen, was sie perfekt für Operationen macht, die den Zustand Ihrer Daten ändern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachIn dieser Herausforderung üben Sie das Erstellen von Methoden mit Pointer-Receivern, indem Sie ein einfaches Bankkontosystem aufbauen. Sie erstellen ein Account-Struct und definieren Methoden, die den Kontostand mithilfe von Pointer-Receivern ändern können.
Sie erhalten drei Eingaben:
- Einen String, der den Namen des Kontoinhabers darstellt (z. B.
"John Smith") - Einen String, der den anfänglichen Kontostand darstellt (z. B.
"1000.50") - Einen String, der einen Transaktionsbetrag darstellt (z. B.
"250.75")
Ihre Aufgabe ist es:
- Ein
Account-Struct mit zwei Feldern zu definieren:Name(string) undBalance(float64) - Eine Methode namens
depositmit einem Pointer-Receiver zu erstellen, die den angegebenen Betrag zum Kontostand addiert - Eine Methode namens
withdrawmit einem Pointer-Receiver zu erstellen, die den angegebenen Betrag vom Kontostand subtrahiert - Eine Methode namens
displayBalancemit einem Value-Receiver zu erstellen, die die Kontoinformationen im Format"Account: [name], Balance: $[balance]"ausgibt - Die Eingaben zu parsen, um eine
Account-Instanz zu erstellen displayBalanceaufzurufen, um den anfänglichen Kontostand anzuzeigendepositmit dem Transaktionsbetrag aufzurufendisplayBalanceaufzurufen, um den Kontostand nach der Einzahlung anzuzeigenwithdrawmit dem Transaktionsbetrag aufzurufendisplayBalanceaufzurufen, um den endgültigen Kontostand anzuzeigen
Der Kontostand sollte mit einer Genauigkeit von zwei Dezimalstellen angezeigt werden. Diese Herausforderung zeigt, wie Pointer-Receiver es Methoden ermöglichen, die ursprünglichen Struct-Daten zu ändern, im Gegensatz zu Value-Receivern, die mit Kopien arbeiten.
Spickzettel
Pointer-Receiver arbeiten direkt mit der ursprünglichen Struct-Instanz, indem sie einen Pointer auf die Struct anstelle einer Kopie erhalten. Dies ermöglicht es Methoden, die ursprünglichen Daten zu ändern.
Um einen Pointer-Receiver zu erstellen, fügen Sie ein Sternchen * vor dem Typnamen in der Receiver-Deklaration hinzu:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // Dies ändert die ursprüngliche Struct
}Verwenden Sie Pointer-Receiver, wenn Ihre Methoden die Felder der Struct aktualisieren müssen. Sie eignen sich daher perfekt für Operationen, die den Zustand Ihrer Daten ändern.
Probier es selbst
package main
import (
"fmt"
"strconv"
)
// TODO: Definiere hier das Account-Struct
// TODO: Definiere hier die deposit-Methode mit Pointer-Receiver
// TODO: Definiere hier die withdraw-Methode mit Pointer-Receiver
// TODO: Definiere hier die displayBalance-Methode mit Value-Receiver
func main() {
// Eingabe lesen
var name string
var initialBalanceStr string
var transactionAmountStr string
fmt.Scanln(&name)
fmt.Scanln(&initialBalanceStr)
fmt.Scanln(&transactionAmountStr)
// String-Eingaben in entsprechende Typen umwandeln
initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
// TODO: Erstelle eine Account-Instanz
// TODO: Zeige den Anfangskontostand an, führe eine Einzahlung durch, zeige den Kontostand an, führe eine Auszahlung durch, zeige den Endkontostand an
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten