Maison > développement back-end > Golang > Comment puis-je utiliser des types génériques dans la fonction « Unmarshal » de Go pour une analyse JSON sécurisée sans recourir à des assertions de type ?

Comment puis-je utiliser des types génériques dans la fonction « Unmarshal » de Go pour une analyse JSON sécurisée sans recourir à des assertions de type ?

Mary-Kate Olsen
Libérer: 2024-10-30 01:08:02
original
573 Les gens l'ont consulté

How can I use generic types in Go's `Unmarshal` function for type-safe JSON parsing without resorting to type assertions?

Les génériques dans Unmarshal, un examen plus approfondi

Les génériques dans Go sont un outil puissant pour écrire du code plus réutilisable et plus sûr. Cependant, lorsqu'il s'agit d'utiliser des génériques avec Unmarshal, nous devons être conscients de certains défis.

Dans cette séance de questions-réponses, l'utilisateur essaie d'utiliser des génériques pour créer un moyen plus sûr de démarshaler. Données JSON dans une structure. Le problème auquel ils sont confrontés est qu'ils ne sont pas en mesure d'utiliser des contraintes de type sur la fonction GetBody(), ce qui les oblige à utiliser des assertions de type dans leur code.

La raison en est que Go le fait. ne prend pas en charge les assertions de type pour les structures, uniquement pour les interfaces. Cela signifie que nous ne pouvons pas convertir la fonction GetBody() en un type spécifique sans connaître au préalable le type exact de la structure.

Une solution possible à ce problème serait d'utiliser une instruction switch pour vérifier le champ ReportType de la structure, puis convertissez la fonction GetBody() en type approprié. Cependant, cette solution n'est pas très élégante et elle peut être difficile à maintenir à mesure que le nombre de types différents que la structure peut contenir augmente.

Une meilleure solution à ce problème consiste à utiliser une expression de type-switch dans le Fonction GetBody(). Cela nous permettra de convertir la fonction GetBody() en type approprié sans avoir à utiliser une instruction switch. C'est une solution plus élégante et elle est également plus maintenable.

Pour illustrer cette solution, voici une version modifiée de la fonction GetBody() :

<code class="go">func (c *ReportContainerImpl[T]) GetBody() (T, error) {
    var body T
    var err error
    switch c.ReportType {
    case ReportTypeExportDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeImportDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeMissingDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeSensorThresoldReport:
        err = json.Unmarshal(c.Body, &body)
    }
    return body, err
}</code>
Copier après la connexion

Avec ce changement, nous peut désormais utiliser la fonction GetBody() pour récupérer le corps de la structure sans avoir à utiliser une instruction switch. Cela rend le code plus élégant et plus facile à maintenir.

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