Menu
Coddy logo textTech

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.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

challenge icon

Aufgabe

Einfach

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

  1. Ein Account-Struct mit zwei Feldern zu definieren: Name (string) und Balance (float64)
  2. Eine Methode namens deposit mit einem Pointer-Receiver zu erstellen, die den angegebenen Betrag zum Kontostand addiert
  3. Eine Methode namens withdraw mit einem Pointer-Receiver zu erstellen, die den angegebenen Betrag vom Kontostand subtrahiert
  4. Eine Methode namens displayBalance mit einem Value-Receiver zu erstellen, die die Kontoinformationen im Format "Account: [name], Balance: $[balance]" ausgibt
  5. Die Eingaben zu parsen, um eine Account-Instanz zu erstellen
  6. displayBalance aufzurufen, um den anfänglichen Kontostand anzuzeigen
  7. deposit mit dem Transaktionsbetrag aufzurufen
  8. displayBalance aufzurufen, um den Kontostand nach der Einzahlung anzuzeigen
  9. withdraw mit dem Transaktionsbetrag aufzurufen
  10. displayBalance aufzurufen, 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
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf