Buch- und Benutzer-Structs
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 99 von 107.
Aufgabe
EinfachErstellen wir die grundlegenden Datenmodelle für unser Bibliotheksverwaltungssystem! Du wirst die grundlegenden Structs erstellen, die Bücher und Bibliotheksmitglieder darstellen, einschließlich Konstruktorfunktionen, die sie mit sinnvollen Standardwerten initialisieren.
Du wirst deinen Code auf drei Dateien verteilen:
book.go: Definiere deinBook-Struct mit Feldern fürID,Title,Author,ISBNundAvailable(Boolean). Erstelle eineNewBook-Konstruktorfunktion, die die ID, den Titel, den Autor und die ISBN als Parameter übernimmt und einen Zeiger auf ein neues Book zurückgibt. Neue Bücher sollen immer als verfügbar beginnen. Füge eineInfo()-Methode hinzu, die die Buchdetails im folgenden Format zurückgibt:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: Definiere deinUser-Struct mit Feldern fürID,Name,EmailundBorrowedBooks(ein Slice von Strings zum Speichern von Buch-IDs). Erstelle einenNewUser-Konstruktor, der ID, Name und E-Mail übernimmt und einen Zeiger auf einen neuen User mit einer leeren Liste ausgeliehener Bücher zurückgibt. Füge eineInfo()-Methode hinzu, die Folgendes zurückgibt:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Führe deine Modelle zusammen, indem du Bücher und Benutzer aus der Eingabe erstellst und anschließend ihre Informationen ausgibst.Lies die Anzahl der Bücher ein und anschließend für jedes Buch seine ID, seinen Titel, seinen Autor und seine ISBN in separaten Zeilen. Lies danach die Anzahl der Benutzer ein und anschließend für jeden Benutzer seine ID, seinen Namen und seine E-Mail in separaten Zeilen.
Gib die Informationen jedes Buchs 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 bei folgender Eingabe:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comDeine Ausgabe sollte wie folgt aussehen:
[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 bei folgender Eingabe:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comDeine Ausgabe sollte wie folgt aussehen:
[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: 0Beachte, wie die Konstruktoren Standardwerte festlegen: Bücher beginnen als verfügbar und Benutzer beginnen mit null ausgeliehenen Büchern. Dieses Muster, Konstruktorfunktionen zu verwenden, um eine korrekte Initialisierung sicherzustellen, 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 zum Speichern von Büchern
// 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 zum Speichern von Benutzern
// 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 Info jedes Buches mit der Info()-Methode aus
// TODO: Gib die Info jedes Benutzers mit der Info()-Methode aus
fmt.Println() // Platzhalter - beim Implementieren entfernen
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker Pool12Fortgeschrittene OOP-Konzepte
Functional-Options-PatternBuilder-Pattern in GoMethod ChainingTyp-Aliase vs. DefinitionenGrundlagen der ReflectionÜberblick über Codegenerierung15Projekt: Bibliotheksverwaltung
Projektübersicht & StrukturBuch- und Benutzer-StructsÜbe selbstständig: Online-Go-Compiler