首页  >  文章  >  后端开发  >  为什么我的 Go Cron Scheduler 打印所有作业的最后一个作业的描述?

为什么我的 Go Cron Scheduler 打印所有作业的最后一个作业的描述?

DDD
DDD原创
2024-11-17 14:10:02130浏览

Why Does My Go Cron Scheduler Print the Last Job's Description for All Jobs?

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

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