首頁  >  文章  >  後端開發  >  為什麼 Go 的 for 迴圈中的匿名函數會捕捉循環變數的最終值?

為什麼 Go 的 for 迴圈中的匿名函數會捕捉循環變數的最終值?

Linda Hamilton
Linda Hamilton原創
2024-11-19 03:49:03780瀏覽

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

for 循環中的匿名函數:意外行為

在你的Go 程式中,你發現你的排程程式沒有印出預期的輸出對於每個預定的作業。該問題歸因於 for 迴圈中使用了匿名函數。

在 for 迴圈中,每次迴圈執行時,匿名函數都會擷取迴圈變數 job。但是,由於只有一個匿名函數,因此它使用循環的最後一次迭代中的作業變數。這會導致所有作業列印上一個作業的描述。

解決方案:為每次迭代建立一個新變數

要解決此問題,請為每個迭代建立一個新變數循環的每次迭代。這將確保每個匿名函數捕獲其自己的循環變數的唯一值:

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

透過此修改,每個匿名函數將擁有自己的作業變數副本,從而正確列印作業的描述它代表。

以上是為什麼 Go 的 for 迴圈中的匿名函數會捕捉循環變數的最終值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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