(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中文網其他相關文章!