Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membetulkan Isu Penutupan Apabila Menjadualkan Kerja dalam Gelung Untuk?

Bagaimana untuk Membetulkan Isu Penutupan Apabila Menjadualkan Kerja dalam Gelung Untuk?

Patricia Arquette
Patricia Arquetteasal
2024-11-24 19:25:13698semak imbas

How to Fix Closure Issues When Scheduling Jobs in a For Loop?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn