Maison > développement back-end > Golang > le corps du texte

Pourquoi Gob lance-t-il « gob : type non enregistré pour l'interface : map[string]interface {} » lors de l'encodage d'une map[string]interface{} ?

Susan Sarandon
Libérer: 2024-11-19 13:06:03
original
935 Les gens l'ont consulté

Why does Gob throw

gob : Encodage de cartes avec des interfaces

Lors de la tentative d'encodage d'une carte[string]interface{} à l'aide de Gob, les utilisateurs peuvent rencontrer l'erreur message : "gob : type non enregistré pour l'interface : map[string]interface {}." Cette erreur se produit car Gob nécessite que le type des données en cours d'encodage soit enregistré avant de pouvoir être traité.

La solution à ce problème est simple : enregistrez le type avec Gob à l'aide de la fonction gob.Register. Dans ce cas, le code suivant doit être ajouté au programme :

gob.Register(map[string]interface{}{})
Copier après la connexion

Cette étape d'enregistrement informe Gob qu'il devrait pouvoir encoder et décoder des cartes avec des clés de chaîne et des valeurs d'interface.

Pour démontrer cela, considérons le code révisé suivant :

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))
}
Copier après la connexion

Maintenant, lorsque ce code est exécuté, l'encodeur Gob encodera avec succès le map[string]interface{} dans un tableau d'octets. Le message d'erreur ne sera plus affiché.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal