Rückblick – REST-API-Modelle
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 78 von 107.
Aufgabe
EinfachErstellen wir ein REST-API-Modellsystem für eine Blogplattform! Du erstellst gut strukturierte Typen, die zu JSON serialisiert werden und lesbare Zeichenfolgendarstellungen bereitstellen – genau das, was du beim Erstellen echter API-Antworten brauchst.
Du verteilst deinen Code auf zwei Dateien:
models.go: Definiere deine API-Datenmodelle mit passenden JSON-Tags und Zeichenfolgendarstellungen.Erstelle ein
Author-Struct mit den FeldernID(int),Name(string) undEmail(string). Ordne ihnen die JSON-Schlüssel"id","name"und"email"zu. ImplementiereString(), sodass das Format[Name] <[Email]>zurückgegeben wird.Erstelle ein
Post-Struct mitID(int),Title(string),Content(string),Author(verschachteltes Author-Struct) undPublished(bool). Ordne ihnen"id","title","content","author"und"published"zu. Für das FeldContentsollteomitemptyverwendet werden, damit leere Inhalte nicht in JSON erscheinen. ImplementiereString(), sodass"[Title]" by [Author's String representation]zurückgegeben wird.Erstelle ein
APIResponse-Struct mitSuccess(bool),Message(string) undData(Post). Ordne ihnen"success","message"und"data"zu. Für das FeldMessagesollteomitemptyverwendet werden.main.go: Erstelle API-Antworten und zeige sowohl die JSON-Ausgabe als auch die Zeichenfolgendarstellungen.Lies zuerst einen Vorgangstyp (
jsonoderdisplay) und dann die Beitragsdetails ein: Beitrags-ID, Titel, Inhalt, Autor-ID, Autorenname, E-Mail-Adresse des Autors und Veröffentlichungsstatus (trueoderfalse).Für
json: Erstelle eine APIResponse mitSuccess: trueund dem Post als Daten (lasse Message leer). Wandle sie in JSON um und gib sie aus.Für
display: Erstelle den Post und gib ihn mit seiner String-Methode aus. Gib anschließend den Author separat in einer neuen Zeile aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Vorgangstyp (
jsonoderdisplay) - Zeile 2: Post-ID
- Zeile 3: Titel
- Zeile 4: Inhalt (kann leer sein)
- Zeile 5: Author-ID
- Zeile 6: Name des Autors
- Zeile 7: E-Mail-Adresse des Autors
- Zeile 8: Veröffentlichungsstatus (
trueoderfalse)
Zum Beispiel bei folgender Eingabe:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueDeine Ausgabe sollte sein:
{"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 folgender Eingabe:
json
2
Draft Post
102
John Doe
john@example.com
falseDeine Ausgabe sollte sein:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}Beachte, dass das leere Feld für den Inhalt in der JSON-Ausgabe ausgelassen wird.
Und bei folgender Eingabe:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueDeine Ausgabe sollte sein:
"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 einlesen
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// Post-ID einlesen
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// Titel einlesen
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// Inhalt einlesen
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// Autor-ID einlesen
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Autorennamen einlesen
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// E-Mail-Adresse des Autors einlesen
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Veröffentlichungsstatus einlesen
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Ein Author-Struct mit den eingelesenen Werten erstellen
// TODO: Ein Post-Struct mit den eingelesenen Werten und dem Author erstellen
// TODO: Den Operationstyp verarbeiten
// Wenn operation "json" ist:
// - Erstelle eine APIResponse mit Success: true und dem Post als Data
// - Konvertiere mit json.Marshal in JSON
// - Gib die JSON-Zeichenfolge 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