Heim  >  Artikel  >  Backend-Entwicklung  >  Golang verwendet functools.partial oder ähnliche Methoden, um das Umschließen anderer Funktionen abzuschließen

Golang verwendet functools.partial oder ähnliche Methoden, um das Umschließen anderer Funktionen abzuschließen

王林
王林nach vorne
2024-02-06 10:15:07966Durchsuche

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

Frageninhalt

(neu bei Golang)

Angenommen, ich habe zwei Funktionen, die mit der zugrunde liegenden API interagieren, und ich möchte diese beiden Funktionen mit Wiederholung umschließen, aber die beiden Funktionen haben unterschiedliche Eingabeparameter.

In Python würde ich functools.partial verwenden, um ein Teilfunktionsobjekt zu erstellen und es an

zu übergeben
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'))

Wie kann ich anhand des einfachen Beispiels oben etwas Ähnliches in Golang machen? Ich habe mir die functools.partial-Paketfunktion angesehen, aber sie scheint beim Erstellen einer Teilfunktion nicht die Übergabe aller Argumente zu ermöglichen?

Gibt es in Golang ein völlig anderes Muster, um dieses Wiederholungsmuster zu erreichen?


Richtige Antwort


Wenn ich das richtig verstehe functools.partial, ermöglicht es Ihnen, Curry-Funktionen zu erstellen.

In Go können Sie Verschlüsse verwenden, um Funktionen zu curryen:

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 unterstützt erstklassige Funktionen, sodass Sie Funktionen als Variablen übergeben können. In diesem Beispiel erstellen wir eine Funktion do,它接受 (a) 任何 int-->int 函数和 (b) int 并返回将该函数应用于 int, die Folgendes ergibt:

func do(f func(int) int, y int) int {
    return f(y)
}

Und, da do 只需要 int-->int 我们可以使用例如neg auch folgt:

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))
}

Siehe: https://www.php.cn/link/7a43ed4e82d06a1e6b2e88518fb8c2b0 p>

Das obige ist der detaillierte Inhalt vonGolang verwendet functools.partial oder ähnliche Methoden, um das Umschließen anderer Funktionen abzuschließen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen