Maison > développement back-end > Golang > Comment sérialiser des structures avec des champs non exportés dans des tableaux d'octets en Go sans réflexion ?

Comment sérialiser des structures avec des champs non exportés dans des tableaux d'octets en Go sans réflexion ?

Barbara Streisand
Libérer: 2024-12-27 18:44:11
original
525 Les gens l'ont consulté

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

Comment puis-je vider des structures dans des tableaux d'octets sans réflexion ?

Vous avez peut-être déjà rencontré le package encoding/binary, mais il repose sur le package Reflect, qui pose un problème lorsqu'il s'agit de structures avec des structures sans majuscule (non exportées) field.

Solution alternative : exploiter le package gob

Pour contourner cette limitation, envisagez d'utiliser le package gob. En implémentant les interfaces GobDecoder et GobEncoder, vous pouvez sérialiser et désérialiser les champs privés de manière sûre et efficace. Cette approche est indépendante de la plate-forme et nécessite uniquement l'ajout de ces fonctions aux structures avec des champs non exportés, laissant le reste de votre code propre.

Exemple d'implémentation

Voici comment vous pouvez implémentez les méthodes GobEncode et 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)
}
Copier après la connexion

Dans votre fonction principale, vous pouvez écrire et lire la structure en utilisant le package 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)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal