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
Barbara Streisandoriginal
2024-12-27 18:44:11505parcourir

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

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

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