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

Bagaimana untuk Membuang Structs dengan Medan Tidak Dieksport ke dalam Tatasusunan Byte dalam Go tanpa Refleksi?

DDD
DDDasal
2024-11-29 08:05:10474semak imbas

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

Melambakkan Struct ke dalam Array Byte tanpa Refleksi

Persoalannya berpunca daripada isu yang dihadapi apabila menggunakan pengekodan/pakej binari untuk membuang struct ke dalam bait tatasusunan. Memandangkan pakej bergantung pada refleksi, ia gagal mengendalikan medan struct yang tidak dieksport (tidak bermodal). Kebimbangan timbul daripada percubaan untuk mengekalkan abstraksi struct data tertentu.

Penyelesaian

Untuk membuang struct dengan medan yang tidak dieksport ke dalam tatasusunan bait tanpa refleksi, pertimbangkan untuk menggunakan gob pakej. Pakej ini menyediakan keupayaan bersiri dan penyahserilan yang cekap dan bebas platform. Dengan melaksanakan antara muka GobEncoder dan GobDecoder untuk struct dengan medan yang tidak dieksport, anda boleh mensiri dan menyahsiri kandungannya dengan berkesan.

Di bawah ialah contoh yang menunjukkan penggunaan pakej gob:

package main

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

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

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

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

Oleh melaksanakan antara muka ini, anda boleh bersiri dan menyahsiri medan struct yang tidak dieksport tanpa perlu untuk refleksi, memastikan lambakan data struct yang betul ke dalam tatasusunan bait.

Atas ialah kandungan terperinci Bagaimana untuk Membuang Structs 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