在 Go 中,可以建立一個函數包裝器,它將函數作為輸入並傳回它的包裝版本。這允許在執行包裝函數之前和之後注入程式碼。
要定義函數包裝器,您必須指定要包裝的函數的簽章。以下是一個範例:
func funcWrapper(myFunc interface{}) { fmt.Println("Before") //call myFunc fmt.Println("After") }
在此範例中,函式包裝器採用 interface{} 類型的變數作為輸入,這使得它可以接受不同簽章的函式。當呼叫包裝的函數時,會執行函數呼叫前後的程式碼。
但是,這種方法需要您指定要包裝的函數的簽章。更靈活的解決方案是使用可以接受任何簽章函數的函數文字:
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) fmt.Println("After, ret =", ret) return } }
此包裝函數採用一個以 int 作為輸入並傳回 int 的函數。然後,它會傳回一個新函數,該函數在呼叫包裝函數之前和之後執行程式碼。
要使用包裝器,請將要包裝的函數作為參數傳遞:
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
此範例包裝了 myfunc 函數,並列印了包裝函數的輸入和傳回值。
在 Go 中,您可以為不同的函數類型建立單獨的包裝函數,以確保類型安全和易用性。
以上是如何在 Go 中建立函數包裝器以在函數執行之前和之後注入程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!