Maison >développement back-end >Golang >Comment puis-je sérialiser efficacement les champs Struct non exportés dans Go sans réflexion ?

Comment puis-je sérialiser efficacement les champs Struct non exportés dans Go sans réflexion ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-06 17:29:17561parcourir

How Can I Efficiently Serialize Unexported Struct Fields in Go without Reflection?

Sérialisation de champs de structure non exportés sans réflexion

La sérialisation de champs de structure non exportés à l'aide de la réflexion peut être gênante. Comment pouvons-nous aborder cette tâche plus efficacement ?

Le package encoding/binary fournit un encodage/décodage binaire, mais il repose fortement sur la réflexion, qui ne fonctionne pas avec les champs non exportés.

Utilisation du package gob

Une solution efficace consiste à utiliser le package gob et à demander à la structure d'implémenter le GobDecoder et Interfaces GobEncoder. Cela permet une sérialisation et une désérialisation personnalisées des champs privés.

Implémentez les méthodes GobEncode et GobDecode dans les structures avec des champs non exportés. Voici un exemple :

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

Exemple d'utilisation :

func main() {
    d := Data{id: 7}
    copy(d.name[:], []byte("tree"))

    // Serialize
    buffer := new(bytes.Buffer)
    enc := gob.NewEncoder(buffer)
    err := enc.Encode(d)
    if err != nil {
        log.Fatal("encode error:", err)
    }

    // Deserialize
    buffer = bytes.NewBuffer(buffer.Bytes())
    e := new(Data)
    dec := gob.NewDecoder(buffer)
    err = dec.Decode(e)
    fmt.Println(e, err)
}

Cette approche permet une sérialisation/désérialisation efficace et indépendante de la plate-forme des champs de structure non exportés, sans encombrement le reste du code.

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