Maison >développement back-end >Golang >Comment puis-je sérialiser efficacement les champs Struct non exportés dans Go sans réflexion ?
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!