Buch- und Benutzer-Structs
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 99 von 107.
Aufgabe
EinfachLassen Sie uns die Kern-Datenmodelle für unser Bibliotheksverwaltungssystem erstellen! Sie werden die grundlegenden Structs erstellen, die Bücher und Bibliotheksmitglieder repräsentieren, ergänzt durch Konstruktorfunktionen, die diese mit sinnvollen Standardwerten initialisieren.
Sie werden Ihren Code über drei Dateien organisieren:
book.go: Definieren Sie IhrBook-Struct mit Feldern fürID,Title,Author,ISBNundAvailable(Boolean). Erstellen Sie eineNewBook-Konstruktorfunktion, die ID, Titel, Autor und ISBN als Parameter entgegennimmt und einen Pointer auf ein neues Book zurückgibt. Neue Bücher sollten immer als verfügbar starten. Fügen Sie eineInfo()-Methode hinzu, die die Details des Buches in folgendem Format zurückgibt:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: Definieren Sie IhrUser-Struct mit Feldern fürID,Name,EmailundBorrowedBooks(ein Slice von Strings, um Buch-IDs zu speichern). Erstellen Sie einenNewUser-Konstruktor, der ID, Name und E-Mail entgegennimmt und einen Pointer auf einen neuen User mit einer leeren Liste ausgeliehener Bücher zurückgibt. Fügen Sie eineInfo()-Methode hinzu, die Folgendes zurückgibt:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Führen Sie Ihre Modelle zusammen, indem Sie Bücher und Benutzer aus der Eingabe erstellen und anschließend deren Informationen anzeigen.Lesen Sie die Anzahl der Bücher ein, und lesen Sie dann für jedes Buch dessen ID, Titel, Autor und ISBN in separaten Zeilen ein. Lesen Sie als Nächstes die Anzahl der Benutzer ein, und lesen Sie für jeden Benutzer dessen ID, Name und E-Mail in separaten Zeilen ein.
Geben Sie die Informationen jedes Buches in einer eigenen Zeile aus, gefolgt von den Informationen jedes Benutzers in einer eigenen Zeile.
Die folgenden Eingaben werden bereitgestellt:
- Anzahl der Bücher
- Für jedes Buch: ID, Titel, Autor, ISBN (jeweils in separaten Zeilen)
- Anzahl der Benutzer
- Für jeden Benutzer: ID, Name, E-Mail (jeweils in separaten Zeilen)
Zum Beispiel, gegeben:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comIhre Ausgabe sollte sein:
[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: 0Und gegeben:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comIhre Ausgabe sollte sein:
[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: 0Beachten Sie, wie die Konstruktoren Standardwerte behandeln – Bücher starten als verfügbar und Benutzer starten mit null ausgeliehenen Büchern. Dieses Muster der Verwendung von Konstruktorfunktionen zur Gewährleistung einer ordnungsgemäßen Initialisierung ist grundlegend für den Aufbau zuverlässiger Systeme!
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Anzahl der Bücher lesen
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Erstelle ein slice, um Bücher zu speichern
// Details jedes Buches lesen
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: Erstelle ein neues Buch mit dem NewBook-Konstruktor und füge es dem slice hinzu
}
// Anzahl der Benutzer lesen
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Erstelle ein slice, um Benutzer zu speichern
// Details jedes Benutzers lesen
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: Erstelle einen neuen Benutzer mit dem NewUser-Konstruktor und füge ihn dem slice hinzu
}
// TODO: Gib die Informationen jedes Buches mit der Info()-Methode aus
// TODO: Gib die Informationen jedes Benutzers mit der Info()-Methode aus
fmt.Println() // Platzhalter - beim Implementieren entfernen
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool12Fortgeschrittene OOP-Konzepte
Functional Options PatternBuilder-Pattern in GoMethodenverkettungTyp-Aliase vs. DefinitionenReflection-GrundlagenÜberblick zur Code-Generierung15Projekt: Bibliotheksverwaltung
Projektübersicht & StrukturBuch- und Benutzer-Structs