Heim > Backend-Entwicklung > Golang > 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

王林
Freigeben: 2024-02-06 10:15:07
nach vorne
991 Leute haben es durchsucht

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'))
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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))
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage