Menu
Coddy logo textTech

Pointer- vs. Value-Receiver

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 8 von 107.

Methoden können entweder einen Wert-Empfänger oder einen Zeiger-Empfänger haben. Ein Wert-Empfänger arbeitet mit einer Kopie des Structs. Ein Zeiger-Empfänger arbeitet mit dem ursprünglichen Struct und kann dessen Felder ändern.

Value-Receiver — arbeitet auf einer Kopie

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Dies verändert das Original NICHT
func (c Counter) IncrementWrong() {
    c.Count++ // Ändert nur die Kopie!
}

Pointer-Receiver — verändert das Original

// Dies verä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
}

Verwenden Sie einen Value-Receiver, wenn die Methode nur Daten liest. Verwenden Sie einen Pointer-Receiver (*StructName), wenn die Methode die Felder des Structs ändern muss. Go übernimmt die Referenzierung automatisch – Sie rufen beide auf die gleiche Weise auf.

challenge icon

Aufgabe

Mittel

Fügen Sie dem Wallet-Struct Methoden unter Verwendung der korrekten Receiver-Typen hinzu:

  • GetBalance — Value-Receiver, gibt den aktuellen Kontostand zurück
  • Deposit — Pointer-Receiver, fügt den Betrag zum Kontostand hinzu
  • Withdraw — Pointer-Receiver, zieht den Betrag nur ab, wenn ausreichend Guthaben vorhanden ist

Spickzettel

Methoden können entweder einen Value-Receiver oder einen Pointer-Receiver haben. Ein Value-Receiver arbeitet mit einer Kopie des Structs. Ein Pointer-Receiver arbeitet mit dem ursprünglichen Struct und kann dessen Felder ändern.

Value-Receiver — arbeitet mit einer Kopie:

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

Pointer-Receiver — modifiziert das Original:

func (c *Counter) Increment() {
    c.Count++
}

Verwenden Sie einen Value-Receiver, wenn die Methode nur Daten liest. Verwenden Sie einen Pointer-Receiver (*StructName), wenn die Methode die Felder des Structs ändern muss.

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())
}
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 Objektorientierte Programmierung