Powtórka — kalkulator figur
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 33 z 107.
Wyzwanie
ŁatwyZbudujmy kalkulator figur, który łączy wszystkie zagadnienia dotyczące interfejsów z tego rozdziału. Stworzysz system, w którym można jednolicie przetwarzać różne figury geometryczne za pomocą wspólnego interfejsu, demonstrując siłę polimorfizmu w Go.
Rozmieścisz kod w trzech plikach:
shape.go: Zdefiniuj interfejsShapez dwiema metodami:Area() float64iPerimeter() float64. Utwórz też funkcję o nazwieDescribeShape, która przyjmuje dowolny element typuShapei zwraca sformatowany ciąg znaków przedstawiający jego pole i obwód.shapes.go: Utwórz dwie struktury implementujące interfejsShape:Rectanglez polamiWidthiHeightCirclez polemRadius
Area()iPerimeter(), a także metodęString()(implementującąfmt.Stringer), która zwraca czytelny opis figury.main.go: Odczytaj dane figur z wejścia, utwórz odpowiednie figury i użyj funkcjiDescribeShape, aby wyświetlić informacje o każdej z nich. Wypisz też bezpośrednio każdą figurę, aby zademonstrować interfejsStringer.
Dane wejściowe będą następujące:
- Wiersz 1: szerokość prostokąta (liczba zmiennoprzecinkowa)
- Wiersz 2: wysokość prostokąta (liczba zmiennoprzecinkowa)
- Wiersz 3: promień koła (liczba zmiennoprzecinkowa)
Do obliczeń użyj 3.14159 jako wartości pi. Obwód koła wynosi 2 * pi * radius.
Metody String() powinny zwracać:
- Rectangle:
Rectangle(Width x Height) - Circle:
Circle(Radius: R)
Funkcja DescribeShape powinna zwracać:
Area: [area], Perimeter: [perimeter]Formatuj wszystkie wartości zmiennoprzecinkowe do dwóch miejsc po przecinku za pomocą %.2f.
Na przykład dla danych wejściowych 4, 3 i 5 wynik powinien wyglądać następująco:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Najpierw wypisz każdą figurę (używając jej metody String()), a następnie jej opis zwrócony przez DescribeShape. Najpierw przetwórz prostokąt, a potem koło.
Spróbuj swoich sił
package main
import (
"fmt"
)
func main() {
// Wczytaj wartości wejściowe
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Utwórz Rectangle o podanej szerokości i wysokości
// TODO: Utwórz Circle o podanym promieniu
// TODO: Wypisz prostokąt (używa metody String())
// TODO: Wypisz opis prostokąta za pomocą DescribeShape()
// TODO: Wypisz koło (używa metody String())
// TODO: Wypisz opis koła za pomocą DescribeShape()
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online