Maison > Article > développement back-end > Les génériques peuvent-ils être utilisés pour le démarshaling JSON dans Go 1.18 ?
Génériques et Unmarshal dans Go 1.18
Dans Go 1.18, les génériques apportent une sécurité de type améliorée au langage. Cependant, certaines limitations surviennent lors de l'utilisation de génériques conjointement avec la désagrégation des données JSON.
Considérez un scénario impliquant plusieurs types de rapports, chacun encapsulé dans un ReportContainerImpl. Le conteneur comprend des paramètres contraints à implémenter l'interface Reportable, représentant différents types de rapports. Cependant, le démarshaling présente un défi en raison du manque de prise en charge par Go de l'assertion de type sur les structures et des pointeurs vers des types génériques bruts.
Pour résoudre ce problème, une interface, ReportContainer, est introduite, permettant à ReportContainerImpl de l'implémenter. Cependant, les contraintes de type sur le type de retour de GetBody() ne peuvent pas être appliquées, ce qui nécessite une assertion de type lors du démarshalage.
L'énigme réside dans le fait que les paramètres de type génériques doivent être connus lors de la compilation, alors que JSON le démarshalage se produit au moment de l'exécution avec des données dynamiques.
Surmonter le défi
La solution la plus viable consiste à abandonner le polymorphisme paramétrique pour ce cas d'utilisation spécifique. Il est recommandé de conserver l'approche json.RawMessage existante, de désorganiser sous condition les données dynamiques dans l'instruction switch et de renvoyer des structures concrètes implémentant l'interface ReportContainer.
Solution alternative : fonction générique de démarshal
Dans les scénarios où les paramètres de type peuvent être connus au moment de la compilation, une fonction de démarshaling générique pourrait être utilisée, comme suit :
<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 cela démontre le concept de démarshaling générique, il convient de noter que Le json.Unmarshal de Go prend déjà en charge le démarshaling dans n'importe quel type. Ainsi, la fonction générique personnalisée ne fait qu'ajouter de la complexité sans apporter de valeur supplémentaire.
En conclusion, lorsqu'il s'agit de données JSON dynamiques et de démarshaling dans Go, il est conseillé de privilégier la sécurité des types grâce à une utilisation appropriée des interfaces et de l'assertion de type plutôt que polymorphisme paramétrique.
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!