Zusammenfassung - 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 Blog-Plattform bauen! Du wirst gut strukturierte Typen erstellen, die nach JSON serialisiert werden und lesbare String-Repräsentationen bieten – genau das, was du beim Erstellen echter API-Antworten benötigen würdest.
Du wirst deinen Code auf zwei Dateien aufteilen:
models.go: Definiere deine API-Datenmodelle mit den richtigen JSON-Tags und String-Repräsentationen.Erstelle ein
Author-Struct mit den FeldernID(int),Name(string) undEmail(string). Ordne diese den JSON-Schlüsseln"id","name"und"email"zu. ImplementiereString(), um das Format[Name] <[Email]>zurückzugeben.Erstelle ein
Post-Struct mitID(int),Title(string),Content(string),Author(verschachteltes Author-Struct) undPublished(bool). Ordne diese"id","title","content","author"und"published"zu. Das FeldContentsollteomitemptyverwenden, damit leerer Inhalt nicht im JSON erscheint. ImplementiereString(), um"[Title]" by [Author's String representation]zurückzugeben.Erstelle ein
APIResponse-Struct mitSuccess(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 String-Repräsentationen.Lies einen Operationstyp (
jsonoderdisplay) ein, lies dann die Post-Details: Post-ID, Titel, Inhalt, Autoren-ID, Autorenname, Autoren-E-Mail und Veröffentlichungsstatus (trueoderfalse).Für
json: Erstelle eine APIResponse mitSuccess: trueund den 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 dann den Autor separat in einer neuen Zeile aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Operationstyp (
jsonoderdisplay) - Zeile 2: Post-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)
Zum Beispiel, gegeben:
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 gegeben:
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, wie das leere Inhaltsfeld in der JSON-Ausgabe weggelassen wird.
Und gegeben:
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 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)
// Autoren-ID lesen
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Autorennamen lesen
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// Autoren-E-Mail lesen
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Veröffentlichungsstatus lesen
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Erstelle ein Author struct mit den gelesenen Werten
// TODO: Erstelle ein Post struct mit den gelesenen Werten und dem Author
// TODO: Verarbeite den Operationstyp
// Wenn die Operation "json" ist:
// - Erstelle eine APIResponse mit Success: true und dem Post als Data
// - Konvertiere zu JSON mittels json.Marshal
// - Gib den JSON-String aus
// Wenn die Operation "display" ist:
// - Gib den Post unter Verwendung seiner String Methode aus
// - Gib den Author in einer neuen Zeile aus
// Platzhalter zur Verwendung von Variablen (beim Implementieren entfernen)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
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-Parser11Standardbibliothek & OOP
io.Reader & io.Writersort.Interfacefmt.Stringer Interfaceencoding/json mit Structshttp.Handler InterfaceZusammenfassung - REST-API-Modelle3Zeiger & 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 Pool