Maison >développement back-end >Golang >golang utilise functools.partial ou des méthodes similaires pour terminer l'encapsulation d'autres fonctions

golang utilise functools.partial ou des méthodes similaires pour terminer l'encapsulation d'autres fonctions

王林
王林avant
2024-02-06 10:15:07985parcourir

golang 使用 functools.partial 或类似的方法来完成包装其他函数

Contenu des questions

(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 ?


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer