Struktury książek i użytkowników
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 99 z 107.
Wyzwanie
ŁatwyZbudujmy podstawowe modele danych dla naszego systemu zarządzania biblioteką! Utworzysz podstawowe struktury reprezentujące książki i członków biblioteki, wraz z funkcjami-konstruktorami, które inicjalizują je sensownymi wartościami domyślnymi.
Rozmieścisz swój kod w trzech plikach:
book.go: Zdefiniuj strukturęBookz polamiID,Title,Author,ISBNiAvailable(wartość logiczna). Utwórz funkcję-konstruktorNewBook, która przyjmuje ID, tytuł, autora i ISBN jako parametry oraz zwraca wskaźnik do nowej książki. Nowe książki powinny zawsze być początkowo dostępne. Dodaj metodęInfo(), która zwraca szczegóły książki w formacie:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: Zdefiniuj strukturęUserz polamiID,Name,EmailiBorrowedBooks(tablica ciągów znaków przechowująca identyfikatory książek). Utwórz konstruktorNewUser, który przyjmuje ID, imię i adres e-mail, a następnie zwraca wskaźnik do nowego użytkownika z pustą listą wypożyczonych książek. Dodaj metodęInfo(), która zwraca:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Połącz modele, tworząc książki i użytkowników na podstawie danych wejściowych, a następnie wyświetlając ich informacje.Wczytaj liczbę książek, a następnie dla każdej książki wczytaj jej ID, tytuł, autora i ISBN w osobnych wierszach. Następnie wczytaj liczbę użytkowników, a dla każdego użytkownika wczytaj jego ID, imię i adres e-mail w osobnych wierszach.
Wyświetl informacje o każdej książce w osobnym wierszu, a następnie informacje o każdym użytkowniku, również w osobnym wierszu.
Podane zostaną następujące dane wejściowe:
- Liczba książek
- Dla każdej książki: ID, tytuł, autor, ISBN (każda wartość w osobnym wierszu)
- Liczba użytkowników
- Dla każdego użytkownika: ID, imię, adres e-mail (każda wartość w osobnym wierszu)
Na przykład dla danych:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comWynik powinien wyglądać następująco:
[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0A dla danych:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comWynik powinien wyglądać następująco:
[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0Zwróć uwagę, jak konstruktory obsługują wartości domyślne: książki są początkowo dostępne, a użytkownicy nie mają początkowo żadnych wypożyczonych książek. Wykorzystywanie funkcji-konstruktorów, aby zapewnić prawidłową inicjalizację, to fundamentalny wzorzec w budowaniu niezawodnych systemów!
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Wczytaj liczbę książek
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Utwórz wycinek do przechowywania książek
// Wczytaj dane każdej książki
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: Utwórz nową książkę za pomocą konstruktora NewBook i dodaj ją do wycinka
}
// Wczytaj liczbę użytkowników
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Utwórz wycinek do przechowywania użytkowników
// Wczytaj dane każdego użytkownika
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: Utwórz nowego użytkownika za pomocą konstruktora NewUser i dodaj go do wycinka
}
// TODO: Wypisz informacje o każdej książce za pomocą metody Info()
// TODO: Wypisz informacje o każdym użytkowniku za pomocą metody Info()
fmt.Println() // Kod tymczasowy – usuń podczas implementacji
}
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 kodu15Projekt: Zarządzanie biblioteką
Przegląd i struktura projektuStruktury książek i użytkownikówPoćwicz samodzielnie: Kompilator Go online