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") }
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 } }
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 } }
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 }
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)
Output:
Before, i = 2 myfunc called with 2 After, ret = 4 Returned: 4
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!