Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencipta Pembungkus Fungsi dalam Pergi ke Inject Code Sebelum dan Selepas Pelaksanaan?

Bagaimana untuk Mencipta Pembungkus Fungsi dalam Pergi ke Inject Code Sebelum dan Selepas Pelaksanaan?

DDD
Lepaskan: 2024-12-03 00:56:11
asal
233 orang telah melayarinya

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

Function Wrapper in Go

Soalan:

Bagaimana saya boleh membuat pembungkus fungsi dalam Pergi ke suntikan kod sebelum dan selepas fungsi pelaksanaan?

Jawapan:

Dalam Go, adalah mungkin untuk mencipta pembungkus fungsi yang mengambil fungsi sebagai hujah dan mengembalikan nilai fungsi baharu. Ini membenarkan untuk menyuntik kod sebelum dan selepas panggilan ke fungsi yang dibalut.

Berikut ialah contoh fungsi pembalut:

func funcWrapper(myFunc interface{}) {
    fmt.Println("Before")
    // Call myFunc
    fmt.Println("After")
}
Salin selepas log masuk

Fungsi Berbalut dengan Tandatangan:

Jika anda mengetahui tandatangan fungsi yang akan dibalut, anda boleh membuat fungsi pembalut yang mengambil nilai fungsi jenis itu dan mengembalikan nilai fungsi lain daripada jenis yang sama. Ini ditunjukkan di bawah:

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
    }
}
Salin selepas log masuk

Menyokong Pelbagai Jenis Fungsi:

Untuk menyokong pelbagai jenis fungsi, anda boleh mencipta fungsi pembungkus yang berasingan untuk setiap jenis yang berbeza:

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
    }
}
Salin selepas log masuk

Penggunaan Pembungkus Generik Refleksi:

Walaupun Go kekurangan generik, pendekatan yang lebih generik menggunakan refleksi boleh dilakukan:

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
}
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini menggunakan antara muka{} jenis pulangan dan memerlukan penegasan jenis apabila menggunakannya.

Contoh Penggunaan:

wf := wrap(myfunc).(func(int) int)
ret := wf(2)
fmt.Println("Returned:", ret)
Salin selepas log masuk

Output:

Before, i = 2
myfunc called with 2
After, ret = 4
Returned: 4
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Pembungkus Fungsi dalam Pergi ke Inject Code Sebelum dan Selepas Pelaksanaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan