Fungsi perangkap penunjuk dan amalan terbaik dalam Go: Perangkap: Penunjuk menunjuk ke fungsi tidak tersedia Amalan terbaik: Gunakan pembolehubah atau penutupan setempat untuk menangkap nilai fungsi. Perangkap: Ubah suai fungsi yang ditunjukkan oleh penunjuk Amalan terbaik: Pastikan penunjuk fungsi tidak boleh diubah suai dan cipta fungsi baharu dalam penutupan lain. Kes praktikal: fungsi panggil balik Contohnya, gunakan penuding fungsi untuk mencipta fungsi log yang mengambil mesej log dan tahap keterukan sebagai parameter fungsi panggil balik.
Perangkap dan Amalan Terbaik Penunjuk Fungsi dalam Go
Dalam Go, penunjuk fungsi ialah mekanisme berkuasa untuk menghantar fungsi sebagai nilai. Walau bagaimanapun, terdapat beberapa perangkap yang perlu diberi perhatian apabila menggunakan penunjuk fungsi:
Perangkap 1: Penunjuk fungsi menghala ke fungsi yang tidak tersedia
Ralat penuding berjuntai berlaku apabila penuding fungsi menghala ke fungsi yang tidak lagi tersedia:
func newFunc() { // ... } func main() { newFuncPtr := newFunc // 将函数 newFunc 赋值给指针 newFuncPtr newFunc = nil // 将 newFunc 设为 nil,使其不可用 newFuncPtr() // 这会触发悬空指针错误 }
Amalan Terbaik: Tangkap nilai fungsi menggunakan pembolehubah tempatan atau penutupan
Untuk mengelakkan penuding berjuntai, tangkap nilai fungsi ke dalam pembolehubah tempatan atau penutupan:
func main() { newFunc := newFunc newFunc() // 仍然有效,因为它捕获了 newFunc 的副本 }
Trap 2: Ubah suai oleh fungsi penunjuk
Untuk fungsi Pengubahsuaian fungsi yang ditunjuk oleh penuding boleh membawa kepada akibat yang tidak diingini:
type API interface { Call() } func makeAPI() API { return func() { fmt.Println("Hello") } } func main() { apiPtr := makeAPI() apiPtr = func() { fmt.Println("Goodbye") } apiPtr.Call() // 输出 "Goodbye" }
Amalan terbaik: Pastikan penunjuk fungsi tidak boleh diubah suai
Jika anda perlu mengubah suai gelagat fungsi, cipta fungsi baharu dalam penutupan lain :
func main() { api := makeAPI() api = func(a API) API { return func() { fmt.Println("Goodbye") a.Call() } }(api) api.Call() // 输出 "Hello", 然后是 "Goodbye" }
Kes praktikal: fungsi panggil balik
Fungsi panggil balik ialah contoh biasa penuding fungsi, yang digunakan untuk memberitahu pemanggil apabila peristiwa berlaku.
Sebagai contoh, kita boleh menggunakan penuding fungsi untuk membina fungsi pengelogan yang mengambil mesej log dan tahap keterukan sebagai hujah kepada fungsi panggil balik:
import "fmt" import "log" type Severity string const ( Info Severity = "INFO" Warning Severity = "WARNING" Error Severity = "ERROR" ) func Log(severity Severity, message string) { log.Println(fmt.Sprintf("%s: %s", severity, message)) } // 获取 severity 为 Info 的日志函数 func InfoLogger() func(string) { return func(message string) { Log(Info, message) } }
Kita kemudian boleh menggunakan fungsi panggil balik untuk menghantar mesej log ke fungsi pengelogan :
rreeeeAtas ialah kandungan terperinci Perangkap dan amalan terbaik penunjuk fungsi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!