Comment les génériques interagissent avec le démarshalling dans Go 1.18
Les génériques dans Go 1.18 offrent une sécurité de type améliorée et une réutilisabilité du code. Cependant, l'utilisation de génériques peut présenter des défis lorsque vous travaillez avec des données dynamiques, comme la désorganisation des charges utiles JSON qui ne sont pas conformes à un type fixe au moment de la compilation.
Dans un scénario où vous disposez d'une collection de rapports, chacun avec des types, vous souhaiterez peut-être les encapsuler à l’aide d’une structure ReportContainerImpl générique. Cette structure permet de représenter plusieurs types de rapports, mais elle introduit le défi de déterminer le type concret au moment de l'exécution lors de la désorganisation.
Pour résoudre ce problème, des contraintes de type peuvent être utilisées pour limiter les types autorisés dans le Type à signaler. Cependant, Go ne prend pas en charge les assertions de type pour les structures et n'autorise pas non plus la conversion en types génériques.
Une approche consiste à créer une interface dédiée, ReportContainer, que la structure ReportContainerImpl implémente. Cette interface fournit des méthodes pour récupérer les champs communs à tous les types de rapport, tels que l'ID d'emplacement, le fournisseur et le type de rapport.
Pendant la désorganisation, une instruction switch peut être utilisée pour déterminer le type concret en fonction du discriminateur ReportType. . Cependant, cela nécessite une conversion manuelle vers un type concret spécifique, qui peut être dangereux et verbeux.
Vous pouvez également envisager d'abandonner le polymorphisme paramétrique dans ce cas spécifique. L'utilisation de json.RawMessage permet de désorganiser les données dynamiques de manière conditionnelle en fonction de la valeur du discriminateur. Cette approche peut être plus adaptée à de tels scénarios, dans lesquels les paramètres de type au moment de la compilation ne correspondent pas aux exigences de manipulation des données d'exécution.
En tant que solution générale, si vous pouvez surmonter le problème de la poule et de l'œuf et avoir des paramètres de type connus au moment de la compilation, envisagez d'implémenter une fonction de démarshalling générique minimaliste comme unmarshalAny. Cette fonction utilise une conversion directe vers le type souhaité et peut être utilisée à des fins d'illustration. Notez que json.Unmarshal est déjà générique, cette approche n'est donc recommandée que si une logique supplémentaire est requise dans unmarshalAny.
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!