Dans votre application Revel, vous avez rencontré une redondance de code causée par différentes fonctions renvoyant des types de données similaires. Au lieu de créer plusieurs fonctions d'assistance pour chaque modèle, vous envisagez une solution dynamique qui renvoie les types d'interface{}. Cette question examine la faisabilité de cette approche.
Oui, il est possible de renvoyer dynamiquement des types de structures dans Go, mais cela nécessite un examen attentif d'interface{} et tapez l'assertion.
Au lieu de []*interface{}, vous devez déclarer votre fonction pour renvoyer une interface{}. Cela permet à la fonction de renvoyer n'importe quel type, y compris les structures.
func (c Helper) ReturnModels(modelName string) interface{}
Considérez l'exemple suivant :
type Post struct { Author string Content string } type Brand struct { Name string } var database map[string]interface{} // Simulates a dynamic data source func ReturnModels(modelName string) interface{} { return database[modelName] // Retrieve data from hypothetical database }
Vous peut utiliser des commutateurs de type ou des assertions de type pour restituer la valeur de retour à son type d'origine.
type switcher func(interface{}) interface{} var result switcher switch modelName := database["myModel"].(type) { case Brand: result = func(v interface{}) interface{} { return v.(Brand) } case Post: result = func(v interface{}) interface{} { return v.(Post) } } fmt.Println(result(database["myModel"]))
Dans Dans cet exemple, l'instruction switch évalue le type des données extraites de la base de données. En fonction du type, la fonction de résultat est affectée à une fonction de conversion spécifique, qui est ensuite invoquée.
Le retour dynamique des types de structure dans Go à l'aide de l'interface{} est réalisable mais nécessite une manipulation minutieuse . Les assertions de type peuvent être utilisées pour garantir que le type correct est converti. Reportez-vous à l'exemple et à la documentation liés pour plus de conseils.
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!