無法在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中文網其他相關文章!