Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Membetulkan Isu Penutupan Apabila Menjadualkan Kerja dalam Gelung Untuk?
Menyelesaikan Isu Penutupan dalam For Loops: Tidak Boleh Menetapkan Pembolehubah kepada Fungsi Tanpa Nama
Dalam konteks mencipta jadual tugas, anda menghadapi masalah di mana kerja berjadual mencetak perihalan kerja terakhir yang diulang dan bukannya kerja mereka sendiri. Isu ini berpunca daripada menggunakan fungsi tanpa nama dalam gelung for.
Cabaran timbul daripada fakta bahawa semua penutupan dalam gelung anda berkongsi pembolehubah yang sama (dalam kes anda, pembolehubah kerja). Semasa anda melalui gelung, pembolehubah telah ditimpa dengan data daripada kerja seterusnya.
Untuk menyelesaikan masalah ini, anda cuba menghantar pembolehubah tugas sebagai hujah kepada fungsi tanpa nama, tetapi anda menerima ralat kerana fungsi dengan parameter mempunyai jenis yang berbeza daripada yang tanpa parameter.
Penyelesaian yang disyorkan adalah untuk mencipta pembolehubah baharu (dalam kes anda, RealJob) untuk setiap lelaran gelung untuk mengekalkan unik rujukan kepada setiap pekerjaan. Dengan berbuat demikian, anda mengelakkan isu penutupan dan memastikan setiap kerja yang dijadualkan mencetak huraian sendiri yang betul.
Berikut ialah kod yang disemak:
for _, job := range config.Jobs { realJob := job // a new variable each time through the loop c.AddFunc("@every "+realJob.Interval, func() { DistributeJob(realJob) }) log.Println("Job " + realJob.Name + " has been scheduled!") }
Atas ialah kandungan terperinci Bagaimana untuk Membetulkan Isu Penutupan Apabila Menjadualkan Kerja dalam Gelung Untuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!