Powtórzenie – modele REST API
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 78 z 107.
Wyzwanie
ŁatwyZbudujmy system modeli REST API dla platformy blogowej! Utworzysz dobrze ustrukturyzowane typy, które serializują się do JSON i zapewniają czytelne reprezentacje tekstowe — dokładnie to, czego potrzebujesz podczas tworzenia rzeczywistych odpowiedzi API.
Uporządkujesz kod w dwóch plikach:
models.go: Zdefiniuj modele danych API z odpowiednimi tagami JSON i reprezentacjami tekstowymi.Utwórz strukturę
Authorz polamiID(int),Name(string) iEmail(string). Przypisz im klucze JSON"id","name"i"email". ZaimplementujString(), aby zwracała format[Name] <[Email]>.Utwórz strukturę
Postz polamiID(int),Title(string),Content(string),Author(zagnieżdżona struktura Author) iPublished(bool). Przypisz im klucze"id","title","content","author"i"published". PoleContentpowinno używaćomitempty, aby pusta treść nie pojawiała się w JSON. ZaimplementujString(), aby zwracała"[Title]" by [Author's String representation].Utwórz strukturę
APIResponsez polamiSuccess(bool),Message(string) iData(Post). Przypisz im klucze"success","message"i"data". PoleMessagepowinno używaćomitempty.main.go: Twórz odpowiedzi API i pokaż zarówno wynik JSON, jak i reprezentacje tekstowe.Wczytaj typ operacji (
jsonlubdisplay), a następnie szczegóły wpisu: ID wpisu, tytuł, treść, ID autora, imię i nazwisko autora, adres e-mail autora oraz status publikacji (truelubfalse).Dla
json: Utwórz APIResponse zSuccess: truei wpisem Post jako danymi (pozostaw Message pusty). Przekonwertuj na JSON i wypisz wynik.Dla
display: Utwórz Post i wypisz go za pomocą jego metody String, a następnie wypisz Author osobno, w nowym wierszu.
Zostaną podane następujące dane wejściowe:
- Wiersz 1: Typ operacji (
jsonlubdisplay) - Wiersz 2: ID wpisu
- Wiersz 3: Tytuł
- Wiersz 4: Treść (może być pusta)
- Wiersz 5: ID autora
- Wiersz 6: Imię i nazwisko autora
- Wiersz 7: Adres e-mail autora
- Wiersz 8: Status publikacji (
truelubfalse)
Na przykład, dla danych:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueWynik powinien być następujący:
{"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}}A dla danych:
json
2
Draft Post
102
John Doe
john@example.com
falseWynik powinien być następujący:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}Zwróć uwagę, że puste pole treści jest pomijane w wyniku JSON.
A dla danych:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueWynik powinien być następujący:
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>Spróbuj swoich sił
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Odczytaj typ operacji
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// Odczytaj identyfikator posta
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// Odczytaj tytuł
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// Odczytaj treść
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// Odczytaj identyfikator autora
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Odczytaj imię i nazwisko autora
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// Odczytaj adres e-mail autora
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Odczytaj status publikacji
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Utwórz strukturę Author z odczytanymi wartościami
// TODO: Utwórz strukturę Post z odczytanymi wartościami i strukturą Author
// TODO: Obsłuż typ operacji
// Jeśli operation ma wartość "json":
// - Utwórz APIResponse z Success: true i Post jako Data
// - Przekształć na JSON za pomocą json.Marshal
// - Wypisz ciąg JSON
// Jeśli operation ma wartość "display":
// - Wypisz Post za pomocą jego metody String
// - Wypisz Author w nowym wierszu
// Kod zastępczy wykorzystujący zmienne (usuń podczas implementacji)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików11Biblioteka standardowa i OOP
io.Reader i io.Writersort.InterfaceInterfejs fmt.Stringerencoding/json ze strukturamiInterfejs http.HandlerPowtórzenie – modele REST API3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online