Tidak Boleh Menetapkan Pembolehubah kepada Fungsi Tanpa Nama dalam untuk Gelung: Perangkap Penutupan
Semasa belajar go-lang, anda menghadapi masalah semasa membangunkan penjadual tugas menggunakan perpustakaan cron. Anda memerhatikan bahawa penjadual sedang mencetak perihalan kerja terakhir untuk semua kerja yang dijadualkan. Tingkah laku ini disebabkan oleh penggunaan fungsi tanpa nama dalam gelung for, yang membawa kepada perangkap penutupan.
Dalam Go, pembolehubah val dalam gelung for mengambil nilai setiap elemen hirisan. Apabila anda menggunakan penutupan dalam gelung, semua penutupan terikat kepada pembolehubah yang sama. Memandangkan goroutine mungkin tidak akan dilaksanakan sehingga selepas gelung, anda akhirnya mencetak elemen terakhir beberapa kali.
Untuk menyelesaikan isu ini, anda cuba menyerahkan tugas sebagai parameter kepada fungsi tanpa nama. Walau bagaimanapun, pustaka cron tidak menerima fungsi dengan parameter, kerana ia menjangkakan jenis fungsi func().
Penyelesaian yang disyorkan ialah mencipta pembolehubah baharu untuk setiap lelaran gelung. Dengan menugaskan kerja semasa kepada pembolehubah baharu (realJob), anda mencipta skop baharu untuk penutupan, memastikan setiap penutupan mempunyai contoh pembolehubah tugasnya sendiri.
Berikut ialah kod yang diperbetulkan:
for _, job := range config.Jobs { realJob := job c.AddFunc("@every "+realJob.Interval, func() { DistributeJob(realJob) }) log.Println("Job " + realJob.Name + " has been scheduled!") }
Dengan mencipta pembolehubah realJob baharu dalam setiap lelaran gelung, anda mengelakkan perangkap penutupan dan memastikan setiap kerja yang dijadualkan mencetak dengan betul penerangan.
Atas ialah kandungan terperinci Mengapa My Go Cron Scheduler Mencetak Perihalan Kerja Terakhir untuk Semua Pekerjaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!