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 consiste à renoncer au polymorphisme paramétrique et à utiliser une instruction switch concrète basée sur la valeur du discriminateur lors du déclassement 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 :
<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>
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 la désorganisation 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.
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!