Maison >développement back-end >Golang >Comment gérer l'assertion de type après avoir désorganisé JSON dans une « interface {} » dans Go ?

Comment gérer l'assertion de type après avoir désorganisé JSON dans une « interface {} » dans Go ?

DDD
DDDoriginal
2024-12-16 21:29:19615parcourir

How to Handle Type Assertion After Unmarshaling JSON into an `interface{}` in Go?

Désagrégation dans une interface{} et exécution d'une assertion de type

Lors de la réception de messages via un système RabbitMQ et de l'exécution d'une assertion de type, il est important de comprendre les types qui ne sont pas marshalés par le package json.

Démarshaling par défaut Types

Par défaut, json.Unmarshal renvoie les valeurs suivantes types :

  • bool
  • float64
  • string
  • []interface{}
  • map[string]interface{}
  • néant

Désagrégation dans une interface{}

Lors du démarshaling dans une interface{}, la valeur renvoyée sera une map[string]interface{} générique. Pour déterminer le type réel dans la carte, vous pouvez soit :

  • Décompresser manuellement les données de la carte.
  • Dégrouper directement dans le type de structure souhaité.

Exemple d'utilisation d'une structure Wrapper

Pour éviter de décompresser manuellement les données, pensez en utilisant une structure wrapper comme la suivante :

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil & smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    if _, ok := err.(*json.UnmarshalTypeError); err != nil & !ok {
        return err
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}

Cette structure wrapper vous permet de désorganiser les données dans Something1 ou Something2, selon le type de données reçues.

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