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