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 :
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.
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