Scénario :
Dans le développement de Golang Revel, du code répétitif apparaît en raison à des types de retour de données similaires impliquant le type struct. Considérez les fonctions suivantes :
func (c Helper) Brands() []*models.Brand { // Query rethinkdb and populate the Brand model var brands []*models.Brand rows.All(&brands) return brands } func (c Helper) BlogPosts() []*models.Post { // Query rethinkdb and populate the Post model var posts []*models.Post rows.All(&posts) return posts }
Dans les deux cas, le type de retour est le même (*[]struct). Pour éviter les duplications, une approche de type de retour dynamique est proposée :
func (c Helper) ReturnModels(modelName string) []*interface{} { // Query rethinkdb with modelName and return []*interface{} }
Questions :
Réponse :
Oui, le retour de type dynamique est réalisable. La fonction doit renvoyer interface{} plutôt que []*interface{}. Voici comment cela peut être implémenté :
func (c Helper) ReturnModels(modelName string) interface{} { // Query rethinkdb with modelName and return interface{} }
Pour utiliser la valeur renvoyée, des commutateurs de type ou des assertions de type sont utilisés pour la restituer à son type d'origine :
Exemple :
if brands, ok := ReturnModels("brands").([]Brand); ok { // ... } if posts, ok := ReturnModels("posts").([]Post); ok { // ... }
En mettant en œuvre cette approche, la duplication de code peut être considérablement réduite en utilisant une seule fonction d'assistance pour les données récupération.
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!