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