JSON Kalıcılık Katmanı
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 102 / 107.
Görev
KolayKütüphane Yönetim Sistemimize veri kalıcılığı ekleyelim! Kütüphanenizin verilerini kaydetmek üzere JSON biçimine dönüştürebilen ve JSON dizelerinden geri yükleyebilen bir JSON kalıcılık katmanı uygulayacaksınız. Bu, oturumlar arasında verileri koruması gereken tüm gerçek uygulamalar için gereklidir.
Kodunuzu beş dosyaya ayıracaksınız:
book.go: Serileştirmeyi denetlemek için JSON struct etiketlerine sahipBookstruct'ınız. Her alanın karşılık gelen bir JSON etiketi olmalıdır:id,title,author,isbnveavailable.NewBookyapıcınızı ekleyin.user.go:User,id,nameveemailiçin JSON struct etiketlerine sahipborrowed_booksstruct'ınız.NewUseryapıcınızı ekleyin.data.go: JSON serileştirmesi için aktarım nesnesi görevi gören birLibraryDatastruct'ı oluşturun. Bu struct'ın iki alanı olmalıdır: Kitap işaretçilerinden oluşan bir dilim olanBooksve Kullanıcı işaretçilerinden oluşan bir dilim olanUsers; her birinin uygun JSON etiketi (booksveusers) bulunmalıdır.library.go: Kitaplar ve kullanıcılar için map'lere sahipLibrarystruct'ınız. İki yeni metot ekleyin:ToJSON():json.MarshalIndentkullanarak iki boşluklu girintiye sahip biçimlendirilmiş bir JSON dizesine dönüştürür. Map'lerdeki tüm kitapları ve kullanıcıları birLibraryDatastruct'ında toplamalı, ardından bunları serileştirmelidir.FromJSON(jsonStr string): Bir JSON dizesi alır, bunu birLibraryDatastruct'ına dönüştürür ve kütüphanenin map'lerini yüklenen kitaplar ve kullanıcılarla doldurur.
main.go: Bir kütüphane oluşturarak ve onu JSON'a dönüştürerek kalıcılık katmanını gösterin.Kitap sayısını okuyun, ardından her kitap için ID'sini, başlığını, yazarını ve ISBN'sini okuyun. Sonra kullanıcı sayısını okuyun ve her kullanıcı için ID'sini, adını ve e-posta adresini okuyun. Kütüphaneyi doldurduktan sonra
ToJSON()metodunu çağırın ve elde edilen JSON dizesini yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Kitap sayısı, ardından her kitabın ID'si, başlığı, yazarı ve ISBN'si (her biri ayrı satırda)
- Kullanıcı sayısı, ardından her kullanıcının ID'si, adı ve e-posta adresi (her biri ayrı satırda)
Örneğin, şu girdi verildiğinde:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comÇıktınız şu şekilde olmalıdır:
{
"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": []
}
]
}Şu girdi verildiğinde:
1
B100
Design Patterns
Gang of Four
978-0201633610
0Çıktınız şu şekilde olmalıdır:
{
"books": [
{
"id": "B100",
"title": "Design Patterns",
"author": "Gang of Four",
"isbn": "978-0201633610",
"available": true
}
],
"users": []
}Önemli: Dilimlerinizi oluşturmak için map'ler üzerinde yineleme yaparken kitapları şu sırayla ekleyin: B001, B002 vb. (ID'ye göre alfabetik olarak sıralanmış şekilde); kullanıcılar için de aynı işlemi uygulayın. Bu, tutarlı JSON çıktısı sağlar. Yineleme yapmadan önce map anahtarları üzerinde sort.Strings kullanabilirsiniz.
LibraryData struct'ı, map tabanlı depolamanız ile JSON'ın dizi tabanlı biçimi arasındaki boşluğu doldurur. Bu aktarım nesnesi deseni, karmaşık veri yapılarını serileştirirken yaygın olarak kullanılır!
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Yeni bir kütüphane oluştur
library := NewLibrary()
// Kitap sayısını oku
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Her kitabın detaylarını oku (ID, title, author, ISBN)
// ve bunları kütüphaneye ekle
for i := 0; i < numBooks; i++ {
// TODO: Kitap ID oku
// TODO: Kitap title oku
// TODO: Kitap author oku
// TODO: Kitap ISBN oku
// TODO: Kitap oluştur ve kütüphaneye ekle
}
// Kullanıcı sayısını oku
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Her kullanıcının detaylarını oku (ID, name, email)
// ve bunları kütüphaneye ekle
for i := 0; i < numUsers; i++ {
// TODO: Kullanıcı ID oku
// TODO: Kullanıcı adını oku
// TODO: Kullanıcı e-postasını oku
// TODO: Kullanıcı oluştur ve kütüphaneye ekle
}
// TODO: Kütüphaneyi JSON'a dönüştür ve yazdır
fmt.Println(library.ToJSON())
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool12İleri Düzey OOP Kavramları
Functional Options DeseniGo'da Builder DeseniMetot ZincirlemeTür Takma Adları vs. TanımlamalarReflection TemelleriKod Üretimine Genel Bakış15Proje: Kütüphane Yönetimi
Projeye Genel Bakış ve YapıKitap ve Kullanıcı Struct'larıKendi başına pratik yap: Online Go derleyicisi