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

Comment puis-je gérer efficacement l'assertion de type après avoir désorganisé JSON dans l'interface {} dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-24 15:56:11613parcourir

How Can I Efficiently Handle Type Assertion After Unmarshalling JSON into interface{} in Go?

Désorganisation dans l'interface{} pour l'assertion de type dans Golang

Dans ce scénario, les chaînes JSON sont transmises via RabbitMQ. Ces chaînes représentent des instances de deux structures différentes, Somthing1 et Somthing2. L'objectif est de réorganiser les chaînes JSON dans leurs structures respectives et d'effectuer des assertions de type.

Le problème

À première vue, il semble que la désorganisation dans une interface{} puis l'application d'assertions de type devrait suffire. Cependant, lors du désorganisation, la variable d'entrée est de type map[string]interface{}. Ce n'est pas comme prévu et les tentatives d'activation de ce type ou de le réaffecter aux structures souhaitées échouent.

La solution

La bibliothèque JSON de Golang désorganise les types par défaut tels que bool, float64 et map[string]interface{}. Pour obtenir les structures souhaitées, vous devez les désorganiser directement ou les convertir manuellement à partir de l'interface map[string]{}.

Utilisation de Direct Unmarshal

L'approche préférée consiste à désorganiser directement dans le structs :

func typeAssert(msg string) {
    var job Somthing1
    json.Unmarshal([]byte(msg), &job)

    // ...

    var stats Somthing2
    json.Unmarshal([]byte(msg), &stats)

    // ...
}

Utilisation d'une structure Unpacker

Si la désorganisation directe n'est pas réalisable, vous pouvez utiliser une structure Unpacker pour gérer la désorganisation et fournir une interface pour accéder aux données :

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    // Attempt to unmarshal into both types
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)

    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

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

    u.Data = smth2
    return nil
}

Ensuite, vous pouvez utiliser le Unpacker pour accéder aux données non organisées :

func typeAssert(msg string) {
    unpacker := &Unpacker{}
    json.Unmarshal([]byte(msg), unpacker)

    switch v := unpacker.Data.(type) {
    case Something1:
        // ...

    case Something2:
        // ...

    default:
        // Handle unknown type
    }
}

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