Passer une fonction arbitraire en tant que paramètre dans Go
Passer des fonctions en tant que paramètres dans Go permet la création et l'exécution dynamiques de code. Cependant, il existe des limites quant aux types de fonctions qui peuvent être transmis.
Considérez le scénario suivant : nous souhaitons créer une fonction de décorateur qui peut envelopper n'importe quelle fonction acceptant un paramètre et renvoyant une seule valeur. Pour gérer les fonctions acceptant ou renvoyant les types interface{}, nous pouvons définir une fonction décoratrice avec func(interface{}) interface{} comme argument.
Cependant, il n'est pas possible de convertir une fonction de type func (string) chaîne à un type de func(interface{}) interface{} implicitement. En effet, les mécanismes des paramètres et des types de retour diffèrent selon les fonctions. Passer un argument interface{} ne garantit pas la compatibilité avec tous les types.
Par exemple, une fonction acceptant une structure comme argument recevra des membres individuels de cette structure. En revanche, une fonction acceptant une interface{} contenant cette structure recevra deux mots : un pour le type et un pour le pointeur vers la structure.
Solution
Sans génériques, il n’existe aucun moyen direct d’obtenir cette fonctionnalité. Cependant, nous pouvons utiliser une fonction d'adaptateur comme solution de contournement :
// Adapter function for func(string) string to func(interface{}) interface{} func adapter(inner func(string) string) func(interface{}) interface{} { return func(arg interface{}) interface{} { // Convert the interface{} arg to a string argString := arg.(string) // Call the inner function with the converted string result := inner(argString) // Return the result return result } }
Maintenant, nous pouvons transmettre funcB au décorateur à l'aide de la fonction d'adaptateur :
fmt.Println(decorate(adapter(funcB), "(This is B's argument)"))
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!