Projektübersicht & Struktur
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 98 von 107.
Aufgabe
EinfachLassen Sie uns das Projekt Bibliotheksverwaltungssystem starten, indem wir die grundlegende Struktur aufbauen! In diesem ersten Schritt erstellen Sie das Grundgerüst, das alle Funktionen unterstützen wird, die wir in den kommenden Lektionen entwickeln werden.
Sie werden Ihren Code über drei Dateien organisieren, um eine saubere Trennung der Zuständigkeiten zu gewährleisten:
book.go: Definieren Sie einBook-Struct, das ein Bibliotheksbuch repräsentiert. Jedes Buch sollte eineID, einenTitle, einenAuthorund einenAvailable-Status (Boolean) haben. Erstellen Sie eine KonstruktorfunktionNewBook, die die ID, den Titel und den Autor als Parameter entgegennimmt und einen Pointer auf ein neues Book zurückgibt, wobeiAvailablestandardmäßig auftruegesetzt ist. Fügen Sie außerdem eineString()-Methode hinzu, die die Informationen des Buches im Format[ID] Title by Authorzurückgibt.user.go: Definieren Sie einUser-Struct, das ein Bibliotheksmitglied mit den FeldernID,NameundEmailrepräsentiert. Erstellen Sie eine KonstruktorfunktionNewUser, die alle drei Werte entgegennimmt und einen Pointer auf einen neuen User zurückgibt. Fügen Sie eineString()-Methode hinzu, dieUser: Name (Email)zurückgibt.main.go: Führen Sie alles zusammen, indem Sie Eingaben lesen, um Bücher und Benutzer zu erstellen, und zeigen Sie dann deren Informationen an.Lesen Sie die Anzahl der zu erstellenden Bücher ein. Lesen Sie für jedes Buch dessen ID, Titel und Autor in separaten Zeilen ein. Lesen Sie dann die Anzahl der Benutzer ein und lesen Sie für jeden Benutzer dessen ID, Name und E-Mail in separaten Zeilen ein.
Nachdem Sie alle Elemente erstellt haben, geben Sie die String-Repräsentation jedes Buches in einer eigenen Zeile aus, gefolgt von der String-Repräsentation jedes Benutzers in einer eigenen Zeile.
Die folgenden Eingaben werden bereitgestellt:
- Anzahl der Bücher
- Für jedes Buch: ID, Titel und Autor (jeweils in separaten Zeilen)
- Anzahl der Benutzer
- Für jeden Benutzer: ID, Name und E-Mail (jeweils in separaten Zeilen)
Zum Beispiel, gegeben:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comSollte Ihre Ausgabe wie folgt aussehen:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)Und gegeben:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comSollte Ihre Ausgabe wie folgt aussehen:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)Dieses Fundament bildet die Kern-Datenmodelle, die Sie im Laufe des Projekts erweitern werden. In der nächsten Lektion werden Sie diese Structs verbessern und die Ausleihfunktionalität hinzufügen!
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
// TODO: Lies die Informationen jedes Buches (ID, Titel, Autor in separaten Zeilen)
// und erstelle Book-Objekte mit NewBook
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)
// TODO: Erstelle ein neues Buch und füge es deinem Slice hinzu
}
// Anzahl der Benutzer lesen
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Erstelle ein Slice, um Benutzer zu speichern
// TODO: Lies die Informationen jedes Benutzers (ID, Name, E-Mail in separaten Zeilen)
// und erstelle User-Objekte mit NewUser
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 und füge ihn deinem Slice hinzu
}
// TODO: Gib die String-Repräsentation jedes Buches aus
// TODO: Gib die String-Repräsentation jedes Benutzers aus
fmt.Println("TODO: Print output here")
}
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