Maison > développement back-end > Golang > Comment puis-je transmettre une fonction arbitraire en tant que paramètre dans Go, en tenant compte des limitations de compatibilité des types ?

Comment puis-je transmettre une fonction arbitraire en tant que paramètre dans Go, en tenant compte des limitations de compatibilité des types ?

Linda Hamilton
Libérer: 2025-01-03 09:16:39
original
427 Les gens l'ont consulté

How Can I Pass an Arbitrary Function as a Parameter in Go, Considering Type Compatibility Limitations?

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
    }
}
Copier après la connexion

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)"))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal