Maison > développement back-end > Golang > Est-ce un cas d'utilisation valable pour les génériques ?

Est-ce un cas d'utilisation valable pour les génériques ?

PHPz
Libérer: 2024-02-06 08:10:12
avant
610 Les gens l'ont consulté

Est-ce un cas dutilisation valable pour les génériques ?

Contenu de la question

Maintenant dans mon code, j'ai un tas de travaux répétitifs qui ressemblent à ceci.

type fp = func(arg1 string, arg2 int, arg3 []string) bool
func decorator(fp fp, arg1 string, arg2 int, arg3 []string) {
    // do some stuff prior to running fp
    res := fp(arg1, arg2, arg3)
    // do some other stuff depending on res
}
Copier après la connexion

Mon problème est que chaque fois que je veux ajouter un nouveau type fp avec un nombre/type de paramètres différent, je dois redéfinir cette méthode, donc je finis par redéfinir le décorateur 4 à 5 fois dans mon code, et j'ai probablement besoin de le faire. plus. Je veux le remplacer par décorateur

type FP = func(a ...interface{}) bool
func Decorator(fp FP, argDetails interface{}) {
    // do stuff
    res := fp(a)
    // do other stuff
}
Copier après la connexion

Et laissez fp affirmer le type. Mais je ne sais pas si cela pose des problèmes/est un mauvais cas d'utilisation, car j'ai vu beaucoup de choses sur la non-utilisation de l'interface/provoquant des problèmes de performances.


Bonne réponse


Les génériques n'aident pas pour certaines raisons, en particulier les génériques seulement aident avec le type, pas le nombre de paramètres. Personnellement, j'aborderais ce problème d'une manière différente :

func decorator(fp func()) {
    // do stuff
   fp()
    // do other stuff
}
Copier après la connexion

Appelez-le en utilisant une fermeture :

var res sometype

decorator(func() {
    res = originalfunc(arg1, arg2, arg3)
})
Copier après la connexion

C'est un peu verbeux sur le site d'appel, mais cela fonctionne absolument pour n'importe quelle signature de fonction - n'importe quel nombre ou type de paramètres et n'importe quel nombre ou type de valeur de retour. Cela fonctionne même avec les appels de méthode. On dirait que vous faites une certaine logique en fonction des résultats, alors autant :

func Decorator(fp func() bool) {
    // do stuff
   res := fp()
    // do other stuff
}

var res someType

Decorator(func() bool {
    res = originalFunc(arg1, arg2, arg3)
    return res
})
Copier après la connexion

Même si la fonction décorée a plus de valeurs de retour que ce booléen ou si vous souhaitez utiliser une autre logique (par exemple, si elle renvoie une erreur, vous souhaitez utiliser != 转换为 bool),它仍然可以工作。 nil).

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal