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
Linda Hamiltonasal
2024-11-30 14:23:15343semak imbas

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)
}

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