Menu
Coddy logo textTech

Odbiorniki wskaźnikowe i wartościowe

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 8 z 107.

Metody mogą mieć odbiornik wartości albo odbiornik wskaźnikowy. Odbiornik wartości działa na kopii struktury. Odbiornik wskaźnikowy działa na oryginalnej strukturze i może modyfikować jej pola.

Odbiornik wartości: działa na kopii

type Counter struct {
    Count int
}

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

// To NIE modyfikuje oryginału
func (c Counter) IncrementWrong() {
    c.Count++ // Zmienia tylko kopię!
}

Odbiornik wskaźnikowy: modyfikuje oryginał

// To FAKTYCZNIE modyfikuje oryginał
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

Używanie obu jednocześnie

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Wynik: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Wynik: 0
}

Użyj odbiorcy wartości, gdy metoda tylko odczytuje dane. Użyj odbiorcy wskaźnikowego (*StructName), gdy metoda musi modyfikować pola struktury. Go automatycznie obsługuje odwołania. Oba wywołujesz w ten sam sposób.

challenge icon

Wyzwanie

Średni

Dodaj metody do struktury Wallet przy użyciu odpowiednich typów odbiorcy:

  • GetBalance: odbiorca wartościowy, zwraca bieżące saldo
  • Deposit: odbiorca wskaźnikowy, dodaje kwotę do salda
  • Withdraw: odbiorca wskaźnikowy, odejmuje kwotę tylko wtedy, gdy dostępne środki są wystarczające

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online