首页 > 后端开发 > Golang > 正文

为什么 Go 的 for 循环中的匿名函数捕获循环变量的最终值?

Linda Hamilton
发布: 2024-11-19 03:49:03
原创
788 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板