Ringkasan, Model REST API
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 78 dari 107.
Tantangan
MudahMari buat sistem model REST API untuk platform blog! Kamu akan membuat tipe yang terstruktur dengan baik, yang diserialisasi ke JSON dan menyediakan representasi string yang mudah dibaca, persis seperti yang kamu perlukan saat membuat respons API sungguhan.
Kamu akan mengatur kodemu dalam dua file:
models.go: Definisikan model data API dengan tag JSON dan representasi string yang sesuai.Buat struct
Authordengan fieldID(int),Name(string), danEmail(string). Petakan field-field ini ke kunci JSON"id","name", dan"email". ImplementasikanString()untuk mengembalikan format[Name] <[Email]>.Buat struct
Postdengan fieldID(int),Title(string),Content(string),Author(struct Author bersarang), danPublished(bool). Petakan field-field ini ke"id","title","content","author", dan"published". FieldContentharus menggunakanomitemptyagar konten kosong tidak muncul dalam JSON. ImplementasikanString()untuk mengembalikan"[Title]" by [Author's String representation].Buat struct
APIResponsedengan fieldSuccess(bool),Message(string), danData(Post). Petakan field-field ini ke"success","message", dan"data". FieldMessageharus menggunakanomitempty.main.go: Buat respons API dan tunjukkan output JSON serta representasi string.Baca tipe operasi (
jsonataudisplay), lalu baca detail post: ID post, judul, konten, ID penulis, nama penulis, email penulis, dan status publikasi (trueataufalse).Untuk
json: Buat APIResponse denganSuccess: truedan Post sebagai data (biarkan Message kosong). Ubah menjadi JSON lalu cetak.Untuk
display: Buat Post dan cetak menggunakan method String-nya, lalu cetak Author secara terpisah pada baris baru.
Input berikut akan diberikan:
- Baris 1: Tipe operasi (
jsonataudisplay) - Baris 2: ID Post
- Baris 3: Judul
- Baris 4: Konten (bisa kosong)
- Baris 5: ID Author
- Baris 6: Nama Author
- Baris 7: Email Author
- Baris 8: Status publikasi (
trueataufalse)
Sebagai contoh, jika diberikan:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueOutputmu seharusnya:
{"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}}Dan jika diberikan:
json
2
Draft Post
102
John Doe
john@example.com
falseOutputmu seharusnya:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}Perhatikan bahwa field konten yang kosong tidak disertakan dalam output JSON.
Dan jika diberikan:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueOutputmu seharusnya:
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>Coba sendiri
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca jenis operasi
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// Baca ID post
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// Baca judul
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// Baca konten
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// Baca ID penulis
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Baca nama penulis
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// Baca email penulis
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Baca status publikasi
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Buat struct Author dengan nilai yang dibaca
// TODO: Buat struct Post dengan nilai yang dibaca dan Author
// TODO: Tangani jenis operasi
// Jika operation bernilai "json":
// - Buat APIResponse dengan Success: true dan Post sebagai Data
// - Ubah menjadi JSON menggunakan json.Marshal
// - Cetak string JSON
// Jika operation adalah "display":
// - Cetak Post menggunakan method String miliknya
// - Cetak Author pada baris baru
// Penanda sementara untuk menggunakan variabel (hapus saat kamu mengimplementasikannya)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File11Pustaka Standar & OOP
io.Reader & io.Writersort.InterfaceAntarmuka fmt.Stringerencoding/json dengan StructAntarmuka http.HandlerRingkasan, Model REST API3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online