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

Les génériques peuvent-ils être utilisés pour le démarshaling JSON dans Go 1.18 ?

Patricia Arquette
Libérer: 2024-10-30 22:22:03
original
565 Les gens l'ont consulté

Can Generics Be Used for JSON Unmarshaling in Go 1.18?

Génériques et Unmarshal dans Go 1.18

Dans Go 1.18, les génériques apportent une sécurité de type améliorée au langage. Cependant, certaines limitations surviennent lors de l'utilisation de génériques conjointement avec la désagrégation des données JSON.

Considérez un scénario impliquant plusieurs types de rapports, chacun encapsulé dans un ReportContainerImpl. Le conteneur comprend des paramètres contraints à implémenter l'interface Reportable, représentant différents types de rapports. Cependant, le démarshaling présente un défi en raison du manque de prise en charge par Go de l'assertion de type sur les structures et des pointeurs vers des types génériques bruts.

Pour résoudre ce problème, une interface, ReportContainer, est introduite, permettant à ReportContainerImpl de l'implémenter. Cependant, les contraintes de type sur le type de retour de GetBody() ne peuvent pas être appliquées, ce qui nécessite une assertion de type lors du démarshalage.

L'énigme réside dans le fait que les paramètres de type génériques doivent être connus lors de la compilation, alors que JSON le démarshalage se produit au moment de l'exécution avec des données dynamiques.

Surmonter le défi

La solution la plus viable consiste à abandonner le polymorphisme paramétrique pour ce cas d'utilisation spécifique. Il est recommandé de conserver l'approche json.RawMessage existante, de désorganiser sous condition les données dynamiques dans l'instruction switch et de renvoyer des structures concrètes implémentant l'interface ReportContainer.

Solution alternative : fonction générique de démarshal

Dans les scénarios où les paramètres de type peuvent être connus au moment de la compilation, une fonction de démarshaling générique pourrait être utilisée, comme suit :

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>
Copier après la connexion

Bien que cela démontre le concept de démarshaling générique, il convient de noter que Le json.Unmarshal de Go prend déjà en charge le démarshaling dans n'importe quel type. Ainsi, la fonction générique personnalisée ne fait qu'ajouter de la complexité sans apporter de valeur supplémentaire.

En conclusion, lorsqu'il s'agit de données JSON dynamiques et de démarshaling dans Go, il est conseillé de privilégier la sécurité des types grâce à une utilisation appropriée des interfaces et de l'assertion de type plutôt que polymorphisme paramétrique.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!