Maison >développement back-end >Golang >golang utilise functools.partial ou des méthodes similaires pour terminer l'encapsulation d'autres fonctions
(nouveau sur Golang)
Supposons que j'ai deux fonctions qui interagissent avec l'API sous-jacente et que je souhaite envelopper ces deux fonctions avec une nouvelle tentative, mais que les deux fonctions ont des paramètres d'entrée différents.
En python, j'utiliserais functools.partial
pour créer un objet func partiel et le transmettre à
from functools import partial def api_1(a, b, c): print(a, b, c) return true def api_2(x, y): print(x, y) return true def with_retries(func) { retries = 0 while retries < 3: err = func() if not err: break retries += 1 } def main(): with_retries(partial(api_1, 1, 2, 3)) with_retries(partial(api_2, 'x', 'y'))
En utilisant l'exemple simple ci-dessus, comment puis-je faire quelque chose de similaire en golang ? J'ai regardé la fonction du package functools.partial
mais elle ne semble pas permettre de passer tous les arguments lors de la création d'une fonction partielle ?
Existe-t-il un modèle complètement différent dans Golang pour réaliser ce modèle de nouvelle tentative ?
Si j'ai bien compris functools.partial
, elle permet de curry des fonctions.
En go, vous pouvez utiliser des fermetures pour curry les fonctions :
func add(x,y int) int { return x+y } // curries add to yield a function that adds 4 func add4(y int) int { return add(4,y) }
go prend en charge les fonctions de première classe, vous pouvez donc transmettre des fonctions en tant que variables. Dans cet exemple, nous créons une fonction do
,它接受 (a) 任何 int-->int
函数和 (b) int
并返回将该函数应用于 int
qui donne :
func do(f func(int) int, y int) int { return f(y) }
Et, puisque do
只需要 int-->int
我们可以使用例如neg
suit également :
package main import "fmt" func Add(x, y int) int { return x + y } func Add4(y int) int { return Add(4, y) } func Neg(x int) int { return -x } func Do(f func(int) int, y int) int { return f(y) } func main() { fmt.Println(Add4(6)) fmt.Println(Do(Add4, 6)) fmt.Println(Do(Neg, 6)) }
Voir : https://www.php.cn/link/7a43ed4e82d06a1e6b2e88518fb8c2b0 p>
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!