Maison > Article > développement back-end > Comment encoder et décoder `map[string]interface{}` avec Gob in Go ?
Encodage de la carte[string]interface{} avec Gob
Dans Go, le package gob fournit un format de sérialisation pour l'encodage et le décodage des valeurs Go . Cependant, il est confronté à des défis lorsqu'il s'agit de types d'interface, y compris le type map[string]interface{}.
Lorsque vous tentez d'encoder une map[string]interface{} à l'aide de gob, l'erreur suivante se produit :
gob: type not registered for interface: map[string]interface {}
Cette erreur indique que gob ne sait pas comment sérialiser le type map[string]interface{} car il n'est pas enregistré avec le package gob. Pour résoudre ce problème et réussir à encoder ce type, nous devons l'enregistrer auprès de gob en utilisant la ligne suivante :
gob.Register(map[string]interface{}{})
Cela indique à gob comment sérialiser et désérialiser les cartes avec des clés de chaîne et des valeurs de types arbitraires.
Voici un exemple modifié qui intègre cet enregistrement :
package main import ( "bytes" "encoding/gob" "encoding/json" "fmt" "log" ) func CloneObject(a, b interface{}) []byte { gob.Register(map[string]interface{}{}) buff := new(bytes.Buffer) enc := gob.NewEncoder(buff) dec := gob.NewDecoder(buff) err := enc.Encode(a) if err != nil { log.Panic("e1: ", err) } b1 := buff.Bytes() err = dec.Decode(b) if err != nil { log.Panic("e2: ", err) } return b1 } func main() { var a interface{} a = map[string]interface{}{"X": 1} b2, err := json.Marshal(&a) fmt.Println(string(b2), err) var b interface{} b1 := CloneObject(&a, &b) fmt.Println(string(b1)) }
En enregistrant le type map[string]interface{}, ce programme peut désormais encoder et décoder avec succès ce type à l'aide du package gob.
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!