"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je désorganiser en toute sécurité JSON avec des types génériques dans Go 1.18 ?

Comment puis-je désorganiser en toute sécurité JSON avec des types génériques dans Go 1.18 ?

Publié le 2024-11-07
Parcourir:714

How Can I Safely Unmarshal JSON with Generic Types in Go 1.18?

Utilisation générique dans Unmarshal (Go 1.18)

Lors de l'utilisation de génériques dans Go 1.18, comme la création d'un conteneur pour contenir différents types de rapports, des contraintes de type peuvent survenir. Considérez la configuration suivante :

  • Plusieurs types de rapports représentés par des structures
  • Un wrapper ReportContainer avec un paramètre de type générique Reportable, contraint à implémenter l'interface Reportable
  • Un discriminateur ReportType pour déterminer le type de rapport concret lors de la désorganisation

Vous pouvez rencontrer des problèmes avec les contraintes de type sur les types de retour, conduisant à une « sémantique de texte libre » dans la fonction GetBody() pour prendre en charge l'assertion de type.

Défis et solutions

Le problème vient du fait que Go ne prend pas en charge les assertions de type pour les structures et n'autorise pas les pointeurs vers des types génériques. Pour résoudre ce problème, vous pouvez créer une interface qui implémente des Getters pour LocationID, Provider, ReportType et Body. Cependant, cette solution nécessite de sacrifier la sécurité des types.

Une approche plus sûre implique de renoncer au polymorphisme paramétrique et d'utiliser une instruction switch concrète basée sur la valeur du discriminateur lors de la désorganisation JSON. Cela garantit que le type concret correct est utilisé pour chaque type de rapport.

Approche alternative

Pour l'analyse JSON dynamique, vous pouvez utiliser une fonction générique de démarchage :

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
}

Bien que cette fonction offre de la flexibilité, il est essentiel de noter que si son implémentation est minimale, elle effectue simplement les mêmes actions que l'intégration directe de la logique de désorganisation. Ainsi, l'utilisation de cette fonction n'est justifiée que si elle introduit une logique supplémentaire.

En résumé, considérez attentivement la nécessité des génériques lorsque vous travaillez avec des types concrets et le démarchage JSON. Optez pour une solution basée sur un commutateur lorsque cela est nécessaire sans compromettre la sécurité du type et faites preuve de prudence lorsque vous utilisez des fonctions génériques qui dupliquent inutilement des fonctionnalités.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3