Initialisation de structure avec des structures intégrées dans Go
La composition de structures est une pratique courante dans Go pour l'organisation et la réutilisation du code. Cependant, l'initialisation de structures composées peut présenter un défi lorsqu'un sous-champ est hérité d'une structure intégrée.
Considérons l'exemple suivant :
type Base struct { ID string } type Child struct { Base a int b int }
Pour initialiser Child, on pourrait s'attendre à utiliser ce qui suit syntaxe :
child := Child{ ID: id, a: a, b: b }
Cependant, cela entraînera une erreur de compilation en raison de l'ID de champ inconnu dans le littéral de la structure Child. Pour contourner ce problème, le champ ID doit être initialisé séparément :
child := Child{ a: 23, b: 42 } child.ID = "foo"
Cette approche viole les principes d'encapsulation en exposant le fait que l'ID est un champ intégré. Cela introduit également le risque de rupture de l'initialisation si un champ public est déplacé dans une structure intégrée.
Pour résoudre ce problème, deux solutions sont recommandées :
Littéraux composites imbriqués :
Les littéraux composites imbriqués peuvent être utilisés pour initialiser un champ incorporé dans un seul expression :
child := Child{Base: Base{ID: id}, a: a, b: b}
Modification proposée dans Go :
Le numéro 9859 de Go propose une modification visant à rendre les littéraux composites cohérents avec l'accès aux champs pour les éléments intégrés genres. S'il est implémenté, ce changement autoriserait la syntaxe suivante :
child := Child{ ID: id, a: a, b: b }
Il est important de noter que les types intégrés ne fournissent pas d'encapsulation au vrai sens du terme. Une application peut toujours accéder directement à child.Base.ID malgré l'utilisation de la syntaxe child.ID.
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!