問題陳述:
您尋求一個接受函數並返回其修改版本的函數包裝器。此包裝器旨在在原始函數呼叫之前和之後注入自訂程式碼執行。
解決方案:
在 Go 中,您可以利用函數文字來實現此目的。給定特定的函數簽名,可以建立包裝函數來接收和傳回具有相同簽名的函數。包裝函數包含所需的自訂行為。
讓我們考慮一個範例:
func myfunc(i int) int { fmt.Println("myfunc called with", i) return i * 2 }
修改和增強函數:
以下包裝函數新增日誌記錄呼叫原始語句之前和之後的語句myfunc:
func wrap(f func(i int) int) func(i int) int { return func(i int) (ret int) { fmt.Println("Before, i =", i) ret = f(i) // Invokes the provided function fmt.Println("After, ret =", ret) return } }
使用和演示:
為了說明,包裝的函數字被分配到一個變量,並且執行:
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
輸出:
Before, i = 2 myfunc called with 2 After, ret = 4 Returned: 4
擴展到多種函數類型:
這個概念可以擴展到支援透過為每個不同類型建立單獨的包裝函數來包裝具有不同參數和傳回類型的函數。例如,包裝沒有參數或傳回類型的函數:
func wrap(f func()) func() { return func() { fmt.Println("Before func()") f() fmt.Println("After func()") } } func wrapInt2Int(f func(i int) int) func(i int) int { return func(i int) (ret int) { fmt.Println("Before func(i int) (ret int), i =", i) ret = f(i) fmt.Println("After func(i int) (ret int), ret =", ret) return } }
以上是如何在Go中創建函數包裝器以在函數執行之前和之後注入程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!