首頁 > 後端開發 > Golang > 如何在Go中建立函數包裝器以在執行前後注入程式碼?

如何在Go中建立函數包裝器以在執行前後注入程式碼?

DDD
發布: 2024-12-03 00:56:11
原創
233 人瀏覽過

How to Create a Function Wrapper in Go to Inject Code Before and After Execution?

Go 中的函數包裝器

問題:

如何建立函數包裝器在如何建立函數包裝器函數之前和之後注入程式碼執行?

答案:

在 Go 中,可以建立一個函數包裝器,它接受一個函數作為參數並傳回一個新的函數值。這允許在呼叫包裝函數之前和之後注入程式碼。

這是包裝函數的範例:

func funcWrapper(myFunc interface{}) {
    fmt.Println("Before")
    // Call myFunc
    fmt.Println("After")
}
登入後複製

帶簽名的包裝函數:

如果您知道要包裝的函數的簽名,則可以建立一個採用該類型的函數值的包裝函數並傳回相同類型的另一個函數值。如下所示:

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
    }
}
登入後複製

支援多種函數類型:

要支援多種函數類型,您可以為每個不同類型建立單獨的包裝函數:

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 缺乏泛型,但使用反射的更通用方法是可能的:

func wrap(f interface{}) interface{} {
    switch f2 := f.(type) {
    case func(i int) (ret int):
        return func(i int) (ret int) {
            fmt.Println("Before func(i int) (ret int), i =", i)
            ret = f2(i)
            fmt.Println("After func(i int) (ret int), ret =", ret)
            return
        }
    case func():
        return func() {
            fmt.Println("Before func()")
            f2()
            fmt.Println("After func()")
        }
    }
    return nil
}
登入後複製

但是,此方法使用interface{} 傳回類型,並且在以下情況下需要類型斷言:使用它。

範例用法:

wf := wrap(myfunc).(func(int) int)
ret := wf(2)
fmt.Println("Returned:", ret)
登入後複製

輸出:

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4
登入後複製

以上是如何在Go中建立函數包裝器以在執行前後注入程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板