首頁 >後端開發 >Golang >golang 使用 functools.partial 或類似的方法來完成包裝其他函數

golang 使用 functools.partial 或類似的方法來完成包裝其他函數

王林
王林轉載
2024-02-06 10:15:07985瀏覽

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

問題內容

(golang 新手)

假設我有兩個與底層 api 互動的函數,我想用重試來包裝這兩個函數,但這兩個函數有不同的輸入參數。

在python中,我將使用functools.partial建立一個部分func物件並將其傳遞給

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

使用上面的簡單範例,我如何在 golang 中做類似的事情?我查看了 functools.partial 套件函數,但該函數似乎不允許在創建部分函數時傳遞所有參數?

golang 中是否有完全不同的模式來完成此重試模式?


正確答案


如果我正確理解 functools.partial,它允許您柯里化函數。

在 go 中,您可以使用閉包來柯里化函數:

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 支援一等函數,因此您可以將函數作為變數傳遞。在本例中,我們建立一個函數do,它接受(a) 任何int-->int 函數和(b) int 並傳回將此函數應用於int 的結果:

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

而且,因為 do 只需要 int-->int 我們可以使用例如neg 也如下:

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

請參閱:https://www.php.cn/link/7a43ed4e82d06a1e6b2e88518fb8c2b0 p>

以上是golang 使用 functools.partial 或類似的方法來完成包裝其他函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除