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 ?
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>
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!