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.
Wyzwanie
ŁatwyW 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:
- Zdefiniować strukturę
Accountz dwoma polami:Name(string) iBalance(float64) - Utworzyć metodę o nazwie
depositz odbiorcą wskaźnikowym, która dodaje podaną kwotę do salda konta - Utworzyć metodę o nazwie
withdrawz odbiorcą wskaźnikowym, która odejmuje podaną kwotę od salda konta - Utworzyć metodę o nazwie
displayBalancez odbiorcą wartościowym, która wyświetla informacje o koncie w formacie:"Account: [name], Balance: $[balance]" - Przetworzyć dane wejściowe, aby utworzyć instancję
Account - Wywołać
displayBalance, aby wyświetlić początkowe saldo - Wywołać
depositz kwotą transakcji - Wywołać
displayBalance, aby wyświetlić saldo po wpłacie - Wywołać
withdrawz kwotą transakcji - 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
}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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online