Menu
Coddy logo textTech

Odbiorniki przez wskaźnik

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 8 z 68.

Podczas gdy odbiorniki wartości działają na kopiach struktur, odbiorniki wskaźnikowe działają bezpośrednio na oryginalnej instancji struktury. Gdy definiujesz metodę z odbiornikiem wskaźnikowym, metoda może modyfikować oryginalne dane, ponieważ otrzymuje wskaźnik do struktury, a nie jej kopię.

Aby utworzyć odbiornik wskaźnikowy, dodaj gwiazdkę * przed nazwą typu w deklaracji odbiornika:

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // To modyfikuje oryginalną strukturę
}

W tym przykładzie (p *Person) jest odbiorcą wskaźnikowym. Gdy wywołujesz metodę haveBirthday na instancji Person, metoda otrzymuje wskaźnik do oryginalnej struktury. Wszelkie zmiany wprowadzone w polach struktury za pośrednictwem tego wskaźnika trwale zmodyfikują oryginalne dane.

Odbiorniki wskaźnikowe są niezbędne, gdy metody muszą aktualizować pola struktury, dzięki czemu doskonale nadają się do operacji zmieniających stan danych.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu poćwiczysz tworzenie metod z odbiorcami wskaźnikowymi, budując prosty system obsługi kont bankowych. Utworzysz strukturę Account i zdefiniujesz metody, które mogą modyfikować saldo konta za pomocą odbiorców wskaźnikowych.

Otrzymasz trzy dane wejściowe:

  • Tekst reprezentujący imię i nazwisko właściciela konta (np. "John Smith")
  • Tekst reprezentujący początkowe saldo konta (np. "1000.50")
  • Tekst reprezentujący kwotę transakcji (np. "250.75")

Twoim zadaniem jest:

  1. Zdefiniować strukturę Account z dwoma polami: Name (string) i Balance (float64)
  2. Utworzyć metodę o nazwie deposit z odbiorcą wskaźnikowym, która dodaje podaną kwotę do salda konta
  3. Utworzyć metodę o nazwie withdraw z odbiorcą wskaźnikowym, która odejmuje podaną kwotę od salda konta
  4. Utworzyć metodę o nazwie displayBalance z odbiorcą wartościowym, która wyświetla informacje o koncie w formacie: "Account: [name], Balance: $[balance]"
  5. Przetworzyć dane wejściowe, aby utworzyć instancję Account
  6. Wywołać displayBalance, aby wyświetlić początkowe saldo
  7. Wywołać deposit z kwotą transakcji
  8. Wywołać displayBalance, aby wyświetlić saldo po wpłacie
  9. Wywołać withdraw z kwotą transakcji
  10. Wywołać displayBalance, aby wyświetlić końcowe saldo

Saldo powinno być wyświetlane z dokładnością do dwóch miejsc po przecinku. To wyzwanie pokazuje, jak odbiorcy wskaźnikowi pozwalają metodom modyfikować dane oryginalnej struktury, w przeciwieństwie do odbiorców wartościowych, które działają na kopiach.

Spróbuj swoich sił

package main

import (
	"fmt"
	"strconv"
)

// TODO: Zdefiniuj tutaj strukturę Account

// TODO: Zdefiniuj tutaj metodę deposit z odbiornikiem wskaźnikowym

// TODO: Zdefiniuj tutaj metodę withdraw z odbiornikiem wskaźnikowym

// TODO: Zdefiniuj tutaj metodę displayBalance z odbiornikiem wartościowym

func main() {
	// Wczytaj dane wejściowe
	var name string
	var initialBalanceStr string
	var transactionAmountStr string
	
	fmt.Scanln(&name)
	fmt.Scanln(&initialBalanceStr)
	fmt.Scanln(&transactionAmountStr)
	
	// Przekonwertuj wejściowe ciągi znaków na odpowiednie typy
	initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
	transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
	
	// TODO: Utwórz instancję Account
	
	// TODO: Wyświetl saldo początkowe, wykonaj wpłatę, wyświetl saldo, wykonaj wypłatę, wyświetl saldo końcowe
}
quiz iconSprawdź się

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

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online