0Pricing
Go Academy · Pelajaran

Refleksi Praktis: Serializer

Membangun serializer sederhana mirip JSON dengan reflect

Refleksi Praktis: Serializer adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Ikhtisar serialiser JSON khusus

Membangun serialiser khusus dengan refleksi menunjukkan penggunaan refleksi secara praktis: mengiterasi bidang struct, membaca penanda, mengakses nilai, dan membangun keluaran — pendekatan yang sama digunakan secara internal oleh encoding/json.

Konversi struct ke map sederhana

Konversikan struct menjadi map[string]any menggunakan refleksi:

func StructToMap(v any) map[string]any {
    t := reflect.TypeOf(v)
    val := reflect.ValueOf(v)
    result := make(map[string]any, t.NumField())
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        if !f.IsExported() { continue }
        key := f.Tag.Get("json")
        if key == "" { key = f.Name }
        result[key] = val.Field(i).Interface()
    }
    return result
}

Menangani penunjuk

Dereferensikan bidang penunjuk sebelum membaca nilainya:

fv := val.Field(i)
if fv.Kind() == reflect.Ptr {
    if fv.IsNil() { continue }
    fv = fv.Elem()
}

Menangani struct bertingkat

Proses bidang struct bertingkat secara rekursif:

if fv.Kind() == reflect.Struct {
    result[key] = StructToMap(fv.Interface())
    continue
}

Dukungan omitempty

Lewati bidang bernilai nol jika penanda menyertakan "omitempty":

if strings.Contains(tag, "omitempty") && fv.IsZero() { continue }

Konversi map ke struct (deserialisasi)

Isi struct dari map dengan mencocokkan kunci map dengan penanda bidang:

func MapToStruct(m map[string]any, dest any) {
    t := reflect.TypeOf(dest).Elem()
    v := reflect.ValueOf(dest).Elem()
    for i := 0; i < t.NumField(); i++ {
        key := t.Field(i).Tag.Get("json")
        if val, ok := m[key]; ok {
            v.Field(i).Set(reflect.ValueOf(val))
        }
    }
}

Pemaksaan tipe

Nilai map dari JSON sering kali berupa float64 untuk angka. Konversikan nilainya ke tipe bidang tujuan saat menetapkannya:

if f.Type.Kind() == reflect.Int && reflect.TypeOf(val).Kind() == reflect.Float64 {
    v.Field(i).SetInt(int64(val.(float64)))
}

Menyimpan cache metadata bidang

Simpan cache pemetaan bidang-ke-penanda dalam sync.Map dengan kunci reflect.Type untuk menghindari refleksi berulang pada setiap panggilan serialisasi.

Alternatif pembuatan kode

Untuk jalur yang kritis terhadap kinerja, buat fungsi serialisasi khusus tipe dengan alat seperti easyjson atau ffjson. Alat tersebut sepenuhnya menghindari refleksi saat runtime.

Kapan membuat serialiser khusus

Serialiser khusus berguna untuk: format non-JSON (BSON, Avro, CSV), aturan pengodean khusus, atau kebutuhan kinerja yang ketat. Untuk sebagian besar kasus penggunaan, encoding/json sudah memadai.

Menguji serializer

Pengujian bolak-balik: serialisasikan struktur menjadi peta, deserialisasikan kembali, lalu pastikan nilainya cocok dengan nilai asli:

u := User{Name: "Alice", Age: 30}
m := StructToMap(u)
var u2 User
MapToStruct(m, &u2)
assert.Equal(t, u, u2)

Pemeriksaan Singkat

Mengapa penyimpanan metadata bidang dalam cache penting saat membangun serializer berbasis refleksi?

Rangkuman: Serializer Berbasis Refleksi

Poin utama:

  • Iterasikan bidang dengan NumField/Field; baca tag dengan Tag.Get
  • Tangani pointer, struktur bertingkat, dan nilai nol
  • Simpan metadata bidang dalam sync.Map demi performa
  • Gunakan pembuatan kode untuk laju pemrosesan tertinggi

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Refleksi Praktis: Serializer” gratis?

Ya — teks lengkap “Refleksi Praktis: Serializer” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Refleksi Praktis: Serializer”?

Membangun serializer sederhana mirip JSON dengan reflect Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Refleksi Praktis: Serializer” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. reflect.Type dan reflect.Value
  2. Memeriksa Field dan Tag Struct
  3. Pemanggilan Fungsi Dinamis
  4. Refleksi Praktis: Serializer
← Kembali ke Go Academy