Lapisan Persistensi JSON
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 102 dari 107.
Tantangan
MudahMari tambahkan persistensi data ke Sistem Manajemen Perpustakaan kita! Kamu akan mengimplementasikan lapisan persistensi JSON yang dapat mengubah data perpustakaanmu ke format JSON untuk disimpan, lalu memuatnya kembali dari string JSON. Ini penting bagi aplikasi nyata yang perlu mempertahankan data antar sesi.
Kamu akan mengatur kodemu dalam lima file:
book.go: StructBookmilikmu dengan tag struct JSON untuk mengatur serialisasi. Setiap field harus memiliki tag JSON yang sesuai:id,title,author,isbn, danavailable. Sertakan constructorNewBook.user.go: StructUsermilikmu dengan tag struct JSON untukid,name,email, danborrowed_books. Sertakan constructorNewUser.data.go: Buat structLibraryDatayang berfungsi sebagai object transfer untuk serialisasi JSON. Struct ini harus memiliki dua field:Books(slice pointer ke Book) danUsers(slice pointer ke User), masing-masing dengan tag JSON yang sesuai (booksdanusers).library.go: StructLibrarymilikmu dengan map untuk buku dan pengguna. Tambahkan dua method baru:ToJSON(): mengubah data perpustakaan menjadi string JSON berformat menggunakanjson.MarshalIndentdengan indentasi dua spasi. Method ini harus mengumpulkan semua buku dan pengguna dari map ke dalam structLibraryData, lalu menserialisasikannya.FromJSON(jsonStr string): menerima string JSON, membatalkan serialisasinya ke dalam structLibraryData, lalu mengisi map perpustakaan dengan buku dan pengguna yang dimuat.
main.go: Peragakan lapisan persistensi dengan membuat perpustakaan dan mengubahnya menjadi JSON.Baca jumlah buku, lalu baca ID, judul, penulis, dan ISBN setiap buku. Berikutnya, baca jumlah pengguna, lalu baca ID, nama, dan email setiap pengguna. Setelah mengisi perpustakaan, panggil
ToJSON()dan cetak string JSON yang dihasilkan.
Input berikut akan diberikan:
- Jumlah buku, lalu ID, judul, penulis, dan ISBN setiap buku (masing-masing pada baris terpisah)
- Jumlah pengguna, lalu ID, nama, dan email setiap pengguna (masing-masing pada baris terpisah)
Contohnya, dengan input:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comOutputmu harus:
{
"books": [
{
"id": "B001",
"title": "The Go Programming Language",
"author": "Alan Donovan",
"isbn": "978-0134190440",
"available": true
},
{
"id": "B002",
"title": "Clean Code",
"author": "Robert Martin",
"isbn": "978-0132350884",
"available": true
}
],
"users": [
{
"id": "U001",
"name": "Alice Smith",
"email": "alice@library.com",
"borrowed_books": []
}
]
}Dan dengan input:
1
B100
Design Patterns
Gang of Four
978-0201633610
0Outputmu harus:
{
"books": [
{
"id": "B100",
"title": "Design Patterns",
"author": "Gang of Four",
"isbn": "978-0201633610",
"available": true
}
],
"users": []
}Penting: Saat melakukan iterasi pada map untuk membuat slice, tambahkan buku dengan urutan: B001, B002, dan seterusnya (diurutkan berdasarkan ID secara alfabetis), begitu pula dengan pengguna. Ini memastikan output JSON konsisten. Kamu dapat menggunakan sort.Strings pada key map sebelum melakukan iterasi.
Struct LibraryData menjembatani penyimpanan berbasis map dengan format berbasis array milik JSON. Pola object transfer ini umum digunakan saat menserialisasi struktur data yang kompleks!
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Buat library baru
library := NewLibrary()
// Baca jumlah buku
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Baca detail setiap buku (ID, judul, penulis, ISBN)
// dan tambahkan ke library
for i := 0; i < numBooks; i++ {
// TODO: Baca ID buku
// TODO: Baca judul buku
// TODO: Baca penulis buku
// TODO: Baca ISBN buku
// TODO: Buat buku dan tambahkan ke library
}
// Baca jumlah pengguna
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Baca detail setiap pengguna (ID, nama, email)
// dan tambahkan ke library
for i := 0; i < numUsers; i++ {
// TODO: Baca ID pengguna
// TODO: Baca nama pengguna
// TODO: Baca email pengguna
// TODO: Buat pengguna dan tambahkan ke library
}
// TODO: Ubah library menjadi JSON dan cetak hasilnya
fmt.Println(library.ToJSON())
}
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 File3Pointer 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 Pool12Konsep OOP Lanjutan
Pola Opsi FungsionalPola Builder di GoMethod ChainingAlias Tipe vs DefinisiDasar-Dasar ReflectionGambaran Umum Pembuatan Kode15Proyek: Manajemen Library
Ikhtisar dan Struktur ProyekStruct Buku dan PenggunaLatihan sendiri: Compiler Go online