首页 >后端开发 >Golang >如何解决在 For 循环中调度作业时的关闭问题?

如何解决在 For 循环中调度作业时的关闭问题?

Patricia Arquette
Patricia Arquette原创
2024-11-24 19:25:13759浏览

How to Fix Closure Issues When Scheduling Jobs in a For Loop?

解决 For 循环中的闭包问题:无法将变量分配给匿名函数

在创建任务计划的上下文中,您遇到了问题其中计划作业打印最后一个迭代作业的描述而不是它们自己的描述。这个问题源于在 for 循环中使用匿名函数。

循环中的所有闭包共享相同的变量(在您的例子中是 job 变量)这一事实引起了挑战。当您进行循环时,该变量被下一个作业的数据覆盖。

为了解决此问题,您尝试将作业变量作为参数传递给匿名函数,但收到错误,因为带参数的函数与不带参数的函数具有不同的类型。

建议的解决方案是为循环的每次迭代创建一个新变量(在您的例子中为 realJob),以维护对每个作业的唯一引用。通过这样做,您可以避免关闭问题,并确保每个计划作业打印自己的正确描述。

这是修改后的代码:

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn