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

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

Barbara Streisand
Barbara Streisandasal
2024-12-27 18:44:11456semak imbas

How to Serialize Structs with Unexported Fields into Byte Arrays in Go without Reflection?

Bagaimanakah cara saya membuang struct ke dalam tatasusunan bait tanpa refleksi?

Anda mungkin telah menemui pengekodan/pakej binari, tetapi ia bergantung pada pakej mencerminkan, yang menimbulkan masalah apabila berurusan dengan struct dengan tidak bermodal (tidak dieksport) medan.

Penyelesaian Alternatif: Memanfaatkan Pakej gob

Untuk memintas pengehadan ini, pertimbangkan untuk menggunakan pakej gob. Dengan melaksanakan antara muka GobDecoder dan GobEncoder, anda boleh mensiri dan menyahsiri medan peribadi dengan selamat dan cekap. Pendekatan ini tidak bergantung pada platform dan hanya memerlukan penambahan fungsi tersebut pada struct dengan medan yang tidak dieksport, meninggalkan seluruh kod anda bersih.

Contoh Pelaksanaan

Begini cara anda boleh melaksanakan kaedah GobEncode dan GobDecode:

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

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

Dalam fungsi utama anda, anda boleh tulis dan baca struct menggunakan pakej gob:

func main() {
    d := Data{id: 7}
    copy(d.name[:], []byte("tree"))
    buffer := new(bytes.Buffer)
    // writing
    enc := gob.NewEncoder(buffer)
    err := enc.Encode(d)
    if err != nil {
        log.Fatal("encode error:", err)
    }
    // reading
    buffer = bytes.NewBuffer(buffer.Bytes())
    e := new(Data)
    dec := gob.NewDecoder(buffer)
    err = dec.Decode(e)
    fmt.Println(e, err)
}

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

Kenyataan:
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