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中文网其他相关文章!