Rumah >pembangunan bahagian belakang >Golang >Mengapa My Go Cron Scheduler Mencetak Perihalan Kerja Terakhir untuk Semua Pekerjaan?

Mengapa My Go Cron Scheduler Mencetak Perihalan Kerja Terakhir untuk Semua Pekerjaan?

DDD
DDDasal
2024-11-17 14:10:02197semak imbas

Why Does My Go Cron Scheduler Print the Last Job's Description for All Jobs?

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!

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