解決「無法在for 循環中將變數分配給匿名函數」中的閉包賦值問題
在構建任務調度程序的上下文中,無法在for 迴圈中將變數指派給匿名函數可能會導致意外行為。當匿名函數捕獲在其範圍之外定義的變數時,會出現此問題,從而導致意外或不正確的結果。
在提到的特定場景中,正在基於包含作業名稱和間隔的設定檔建立排程器。每個作業都使用「cron」函式庫進行調度,這需要指定一個 cron 表達式和要執行的函數。但是,程式碼錯誤地迭代作業並將相同的匿名函數指派給每個調度程序,從而導致列印錯誤的作業描述。
要解決此問題,我們需要確保每個匿名函數捕獲其預期變數。這可以透過為循環的每次迭代創建一個新變量來實現,如下所示:
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!") }
透過為每次迭代使用新變量,我們確保每個匿名函數捕獲正確的作業對象,消除了它們都引用相同變數並導致意外結果的問題。這種方法提供了準確的作業描述並確保排程器的預期行為。
以上是在For迴圈中排程作業時如何避免閉包分配問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!