Projektübersicht & Struktur
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 98 von 107.
Aufgabe
EinfachBeginnen wir mit dem Projekt „Bibliotheksverwaltungssystem“, indem wir die grundlegende Struktur einrichten! In diesem ersten Schritt erstellst du das grundlegende Gerüst, das alle Funktionen unterstützen wird, die wir in den kommenden Lektionen entwickeln.
Du organisierst deinen Code auf drei Dateien, um eine klare Trennung der Zuständigkeiten zu gewährleisten:
book.go: Definiere eineBook-Struktur, die ein Bibliotheksbuch repräsentiert. Jedes Buch sollte eineID, einenTitle, einenAuthorund einenAvailable-Status (boolesch) haben. Erstelle eine KonstruktorfunktionNewBook, die die ID, den Titel und den Autor als Parameter entgegennimmt und einen Zeiger auf ein neues Book zurückgibt, wobeiAvailablestandardmäßig auftruegesetzt wird. Füge außerdem eineString()-Methode hinzu, die die Informationen des Buches im Format[ID] Title by Authorzurückgibt.user.go: Definiere eineUser-Struktur, die ein Bibliotheksmitglied mit den FeldernID,NameundEmailrepräsentiert. Erstelle eine KonstruktorfunktionNewUser, die alle drei Werte entgegennimmt und einen Zeiger auf einen neuen User zurückgibt. Füge eineString()-Methode hinzu, die Folgendes zurückgibt:User: Name (Email)main.go: Führe alles zusammen, indem du Eingaben einliest, um Bücher und Benutzer zu erstellen, und anschließend ihre Informationen anzeigst.Lies die Anzahl der zu erstellenden Bücher ein. Lies für jedes Buch seine ID, seinen Titel und seinen Autor in separaten Zeilen ein. Lies anschließend die Anzahl der Benutzer ein und für jeden Benutzer dessen ID, Namen und E-Mail-Adresse in separaten Zeilen.
Nachdem alle Elemente erstellt wurden, gib die Zeichenfolgendarstellung jedes Buches in einer eigenen Zeile aus, gefolgt von der Zeichenfolgendarstellung 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-Adresse (jeweils in separaten Zeilen)
Zum Beispiel bei folgender Eingabe:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comDeine Ausgabe sollte folgendermaßen aussehen:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)Und bei folgender Eingabe:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comDeine Ausgabe sollte folgendermaßen aussehen:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)Diese Grundlage etabliert die zentralen Datenmodelle, die du im weiteren Verlauf des Projekts erweitern wirst. In der nächsten Lektion wirst du diese Strukturen verbessern und die Ausleihfunktion 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 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