Rückblick – REST-API-Modelle
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 78 von 107.
Aufgabe
EinfachLass uns ein REST-API-Modellsystem für eine Blogplattform erstellen! Du wirst gut strukturierte Typen erstellen, die in JSON serialisiert werden und lesbare Zeichenfolgendarstellungen bereitstellen – genau das, was du beim Erstellen echter API-Antworten benötigst.
Du wirst deinen Code auf zwei Dateien verteilen:
models.go: Definiere deine API-Datenmodelle mit geeigneten JSON-Tags und Zeichenfolgendarstellungen.Erstelle eine
Author-Struktur mit den FeldernID(int),Name(string) undEmail(string). Ordne diese den JSON-Schlüsseln"id","name"und"email"zu. ImplementiereString(), sodass das Format[Name] <[Email]>zurückgegeben wird.Erstelle eine
Post-Struktur mit den FeldernID(int),Title(string),Content(string),Author(verschachtelte Author-Struktur) undPublished(bool). Ordne diese"id","title","content","author"und"published"zu. Das FeldContentsollteomitemptyverwenden, damit leerer Inhalt nicht in JSON erscheint. ImplementiereString(), sodass"[Title]" by [Author's String representation]zurückgegeben wird.Erstelle eine
APIResponse-Struktur mit den FeldernSuccess(bool),Message(string) undData(Post). Ordne diese"success","message"und"data"zu. Das FeldMessagesollteomitemptyverwenden.main.go: Erstelle API-Antworten und demonstriere sowohl die JSON-Ausgabe als auch die Zeichenfolgendarstellungen.Lies einen Operationstyp (
jsonoderdisplay) und anschließend die Beitragsdetails: Beitrags-ID, Titel, Inhalt, Autoren-ID, Autorenname, Autoren-E-Mail und Veröffentlichungsstatus (trueoderfalse).Für
json: Erstelle eine APIResponse mitSuccess: trueund dem Post als Daten (lasse Message leer). Konvertiere sie in JSON und gib sie aus.Für
display: Erstelle den Post und gib ihn mit seiner String-Methode aus. Gib anschließend den Autor separat in einer neuen Zeile aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Operationstyp (
jsonoderdisplay) - Zeile 2: Beitrags-ID
- Zeile 3: Titel
- Zeile 4: Inhalt (kann leer sein)
- Zeile 5: Autoren-ID
- Zeile 6: Autorenname
- Zeile 7: Autoren-E-Mail
- Zeile 8: Veröffentlichungsstatus (
trueoderfalse)
Beispielsweise bei folgenden Eingaben:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueDeine Ausgabe sollte wie folgt aussehen:
{"success":true,"data":{"id":1,"title":"Getting Started with Go","content":"Learn the basics of Go programming","author":{"id":101,"name":"Jane Smith","email":"jane@example.com"},"published":true}}Und bei folgenden Eingaben:
json
2
Draft Post
102
John Doe
john@example.com
falseDeine Ausgabe sollte wie folgt aussehen:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}Beachte, wie das leere Inhaltsfeld in der JSON-Ausgabe weggelassen wird.
Und bei folgenden Eingaben:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueDeine Ausgabe sollte wie folgt aussehen:
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>Probier es selbst
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Operationstyp lesen
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// Post-ID lesen
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// Titel lesen
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// Inhalt lesen
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// Autor-ID lesen
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Autorname lesen
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// E-Mail des Autors lesen
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Veröffentlichungsstatus lesen
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Erstelle eine Author-struct mit den gelesenen Werten
// TODO: Erstelle eine Post-struct mit den gelesenen Werten und dem Author
// TODO: Behandle den Operationstyp
// Wenn operation "json" ist:
// - Erstelle eine APIResponse mit Success: true und dem Post als Data
// - Konvertiere zu JSON mit json.Marshal
// - Gib den JSON-String aus
// Wenn operation "display" ist:
// - Gib den Post mit seiner String-Methode aus
// - Gib den Author in einer neuen Zeile aus
// Platzhalter zur Verwendung der Variablen (bei der Implementierung entfernen)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
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 – Dateiparser11Standardbibliothek & OOP
io.Reader & io.Writersort.Interfacefmt.Stringer-Interfaceencoding/json mit Structshttp.Handler-InterfaceRückblick – REST-API-Modelle3Zeiger & 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 PoolÜbe selbstständig: Online-Go-Compiler