Rumah >pembangunan bahagian belakang >Golang >Mengapakah Fungsi Tanpa Nama dalam Gelung `for` Go Menangkap Nilai Akhir Pembolehubah Gelung?

Mengapakah Fungsi Tanpa Nama dalam Gelung `for` Go Menangkap Nilai Akhir Pembolehubah Gelung?

Linda Hamilton
Linda Hamiltonasal
2024-11-19 03:49:03846semak imbas

Why Do Anonymous Functions in Go's `for` Loops Capture the Final Value of the Loop Variable?

Fungsi Tanpa Nama dalam untuk Gelung: Gelagat Tidak Dijangka

Dalam program Go anda, anda telah mendapati bahawa penjadual anda tidak mencetak output yang dijangkakan untuk setiap kerja yang dijadualkan. Masalahnya dikaitkan dengan penggunaan fungsi tanpa nama dalam gelung for.

Dalam gelung for, fungsi tanpa nama menangkap kerja pembolehubah gelung setiap kali gelung dilaksanakan. Walau bagaimanapun, oleh kerana hanya terdapat satu fungsi tanpa nama, ia menggunakan pembolehubah kerja daripada lelaran terakhir gelung. Ini menyebabkan semua kerja mencetak perihalan kerja terakhir.

Penyelesaian: Cipta Pembolehubah Baharu untuk Setiap Lelaran

Untuk menyelesaikan isu ini, cipta pembolehubah baharu untuk setiap lelaran gelung. Ini akan memastikan bahawa setiap fungsi tanpa nama menangkap nilai unik pembolehubah gelungnya sendiri:

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!")
}

Dengan pengubahsuaian ini, setiap fungsi tanpa nama akan mempunyai salinan pembolehubah tugasnya sendiri, mencetak perihalan tugas dengan betul ia mewakili.

Atas ialah kandungan terperinci Mengapakah Fungsi Tanpa Nama dalam Gelung `for` Go Menangkap Nilai Akhir Pembolehubah Gelung?. 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