Pointer Receiver
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 8 von 68.
Während Wert-Empfänger mit Kopien von Strukturen arbeiten, arbeiten Zeiger-Empfänger direkt mit der ursprünglichen Strukturinstanz. Wenn du eine Methode mit einem Zeiger-Empfänger definierst, kann die Methode die ursprünglichen Daten ändern, weil sie einen Zeiger auf die Struktur statt 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 du die Methode haveBirthday für eine Instanz von Person aufrufst, erhält die Methode einen Pointer auf die ursprüngliche Struktur. Alle Änderungen, die über diesen Pointer an den Feldern der Struktur vorgenommen werden, ändern 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.
Aufgabe
EinfachIn dieser Herausforderung übst du, Methoden mit Pointer-Receivern zu erstellen, indem du ein einfaches Bankkontosystem entwickelst. Du erstellst eine Account-Struktur und definierst Methoden, die den Kontostand mithilfe von Pointer-Receivern ändern können.
Du erhältst drei Eingaben:
- Eine Zeichenkette, die den Namen des Kontoinhabers darstellt (z. B.
"John Smith") - Eine Zeichenkette, die den anfänglichen Kontostand darstellt (z. B.
"1000.50") - Eine Zeichenkette, die einen Transaktionsbetrag darstellt (z. B.
"250.75")
Deine Aufgabe ist es:
- Eine
Account-Struktur 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 verarbeiten, 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 Daten der ursprünglichen Struktur zu ändern, während Value-Receiver mit Kopien arbeiten.
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Übe selbstständig: Online-Go-Compiler