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 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.

challenge icon

Aufgabe

Mittel

Füge der Struktur Wallet Methoden mit den korrekten Empfängertypen hinzu:

  • GetBalance: Wertempfänger, gibt den aktuellen Kontostand zurück
  • Deposit: Zeigerempfänger, addiert den Betrag zum Kontostand
  • Withdraw: 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())
}
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

Übe selbstständig: Online-Go-Compiler