Dalam Go, adalah mungkin untuk mencipta pembungkus fungsi yang mengambil fungsi sebagai input dan mengembalikan versi pembalutnya. Ini membolehkan kod suntikan sebelum dan selepas pelaksanaan fungsi yang dibalut.
Untuk menentukan pembalut fungsi, anda mesti menyatakan tandatangan fungsi yang ingin dibalut. Berikut ialah contoh:
func funcWrapper(myFunc interface{}) { fmt.Println("Before") //call myFunc fmt.Println("After") }
Dalam contoh ini, pembalut fungsi mengambil pembolehubah antara muka jenis{} sebagai input, yang membolehkannya menerima fungsi tandatangan yang berbeza. Apabila fungsi yang dibalut dipanggil, kod sebelum dan selepas panggilan fungsi dilaksanakan.
Walau bagaimanapun, pendekatan ini memerlukan anda untuk menentukan tandatangan fungsi yang anda ingin bungkus. Penyelesaian yang lebih fleksibel ialah menggunakan literal fungsi yang boleh menerima fungsi mana-mana tandatangan:
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 } }
Fungsi pembalut ini mengambil fungsi yang mengambil int sebagai input dan mengembalikan int. Ia kemudian mengembalikan fungsi baharu yang melaksanakan kod sebelum dan selepas fungsi yang dibalut dipanggil.
Untuk menggunakan pembalut, anda lulus fungsi yang anda mahu bungkus sebagai hujah:
wf := wrap(myfunc) ret := wf(2) fmt.Println("Returned:", ret)
Contoh ini membalut fungsi myfunc dan mencetak nilai input dan mengembalikan fungsi yang dibalut.
Dalam Go, anda boleh mencipta fungsi pembalut yang berasingan untuk pelbagai jenis fungsi untuk memastikan jenis keselamatan dan kemudahan penggunaan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Pembungkus Fungsi dalam Go to Inject Code Sebelum dan Selepas Pelaksanaan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!