Maison > développement back-end > Golang > le corps du texte

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

王林
Libérer: 2024-02-06 10:15:07
avant
954 Les gens l'ont consulté

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

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

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

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

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!

source:stackoverflow.com
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!