Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mensiri Struktur dengan Medan Tidak Dieksport ke dalam Tatasusunan Byte tanpa Refleksi?

Bagaimana untuk Mensiri Struktur dengan Medan Tidak Dieksport ke dalam Tatasusunan Byte tanpa Refleksi?

Linda Hamilton
Lepaskan: 2024-11-30 14:23:15
asal
365 orang telah melayarinya

How to Serialize Structs with Unexported Fields into a Byte Array without Reflection?

Melambakkan Struct ke dalam Tatasusunan Byte tanpa Refleksi

Apabila bekerja dengan struct yang mempunyai medan yang tidak dieksport, pengekodannya ke dalam data binari boleh menjadi satu cabaran. Walaupun pengekodan/pakej binari menawarkan penyelesaian, pergantungannya pada refleksi boleh membawa kepada isu dengan medan yang tidak dieksport.

Penyelesaian Alternatif

Untuk mengatasi had ini, pertimbangkan untuk menggunakan pakej gob. Pakej gob menyediakan cara yang mudah dan cekap untuk mensiri dan menyahsiri struktur data, walaupun yang mempunyai medan peribadi. Begini cara anda boleh melaksanakannya:

  1. Laksanakan Fungsi GobEncode dan GobDecode:
    Tentukan fungsi ini untuk struct dengan medan yang tidak dieksport. Fungsi ini akan membimbing pakej gob dalam mensiri dan menyahsiri data.
  2. Gunakan gob.Encoder dan gob.Decoder:
    Buat kejadian gob.Encoder dan gob.Decoder untuk menulis atau baca data struct ke atau dari bait penimbal.

Contoh

Pertimbangkan contoh kod berikut:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)

type Data struct {
    id    int32
    name   [16]byte
}

func (d *Data) GobEncode() ([]byte, error) {
    w := new(bytes.Buffer)
    enc := gob.NewEncoder(w)
    err := enc.Encode(d.id)
    if err != nil {
        return nil, err
    }
    err = enc.Encode(d.name)
    if err != nil {
        return nil, err
    }
    return w.Bytes(), nil
}

func (d *Data) GobDecode(buf []byte) error {
    r := bytes.NewBuffer(buf)
    dec := gob.NewDecoder(r)
    err := dec.Decode(&d.id)
    if err != nil {
        return err
    }
    return dec.Decode(&d.name)
}

func main() {
    d := Data{id: 7}
    copy(d.name[:], []byte("tree"))
    buffer := new(bytes.Buffer)

    // Write
    enc := gob.NewEncoder(buffer)
    err := enc.Encode(d)
    if err != nil {
        fmt.Println("Encode error:", err)
        return
    }

    // Read
    buffer = bytes.NewBuffer(buffer.Bytes())
    e := new(Data)
    dec := gob.NewDecoder(buffer)
    err = dec.Decode(e)
    if err != nil {
        fmt.Println("Decode error:", err)
        return
    }
    fmt.Println(e)
}
Salin selepas log masuk

Dengan mengikuti pendekatan ini, anda boleh membuang dan mendapatkan semula dengan berkesan data struct dengan medan yang tidak dieksport ke dalam tatasusunan bait tanpa bergantung pada pantulan.

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Struktur dengan Medan Tidak Dieksport ke dalam Tatasusunan Byte tanpa Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan