首頁  >  文章  >  後端開發  >  為什麼我的 Go Cron Scheduler 會列印所有作業的最後一個作業的描述?

為什麼我的 Go Cron Scheduler 會列印所有作業的最後一個作業的描述?

DDD
DDD原創
2024-11-17 14:10:02136瀏覽

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

無法在for 循環中為匿名函數賦值:閉包陷阱

在學習go-lang 時,您正在開發一個使用cron庫的任務調度程序。您觀察到排程器正在列印所有排程作業的最後一個作業的描述。這種行為是由於在 for 迴圈中使用匿名函數導致的,從而導致閉包陷阱。

在 Go 中,for 迴圈中的 val 變數會採用每個切片元素的值。當您在循環中使用閉包時,所有閉包都會綁定到同一個變數。由於 goroutine 可能要等到循環之後才會執行,因此您最終會多次列印最後一個元素。

為了解決此問題,您嘗試將作業作為參數傳遞給匿名函數。但是,cron 函式庫不接受帶有參數的函數,因為它需要 func() 的函數型別。

建議的解決方案是為循環的每次迭代建立一個新變數。透過將目前作業指派給新變數 (realJob),您可以為閉包建立一個新作用域,確保每個閉包都有自己的作業變數實例。

以下是已修正的程式碼:

for _, job := range config.Jobs {
    realJob := job
    c.AddFunc("@every "+realJob.Interval, func() {
        DistributeJob(realJob)
    })
    log.Println("Job " + realJob.Name + " has been scheduled!")
}

透過在每次循環迭代中建立一個新的realJob 變量,您可以避免閉包陷阱並確保每個排程作業列印正確的描述。

以上是為什麼我的 Go Cron Scheduler 會列印所有作業的最後一個作業的描述?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn