gpt4 book ai didi

go - 无法将变量分配给 for 循环中的匿名函数

转载 作者:IT王子 更新时间:2023-10-29 01:24:55 25 4
gpt4 key购买 nike

我正在通过开发任务计划来学习 go-lang。 cron library我使用接受一个 cron 表达式和一个 func 作为参数来添加一个调度程序。

c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })

我正在根据 yaml 文件开发计划作业。所以我迭代作业以添加这样的调度:

type Job struct {    Name        string    Interval    string}func DistributeJob(job Job) {    log.Println("running", job, job.Interval)}func main() {    //load config from yaml    c := cron.New()    for _, job := range config.Jobs {        c.AddFunc("@every "+job.Interval, func() {            DistributeJob(job)        })        log.Println("Job " + job.Name + " has been scheduled!")    }    c.Start()    select {}}

所有作业都按它们的时间间隔安排,但事实证明它们正在打印最后一个作业的描述。例如,如果我安排两个作业,第一个间隔为 3 分钟,后一个间隔为 1 分钟。控制台打印:

12:01: Running latter 1min12:02: Running latter 1min12:03: Running latter 1min12:03: Running latter 1min//this one should be the first job

我觉得问题出在

    func() {        DistributeJob(job)    })

似乎只需要最后一份工作,但我不明白为什么。我尝试使用

    c.AddFunc("@every "+job.Interval, func(job JobType) {        DistributeJob(job)    }(job))

但由于不能用作值而失败

最佳答案

虽然您没有使用 goroutine,但您所犯的错误与此处描述的错误几乎相同:https://github.com/golang/go/wiki/CommonMistakes#using-closures-with-goroutines

引用:

The val variable in the above loop is actually a single variable that takes on the value of each slice element. Because the closures are all only bound to that one variable, there is a very good chance that when you run this code you will see the last element printed for every iteration instead of each value in sequence, because the goroutines will probably not begin executing until after the loop.

所以您尝试的修复(将其作为参数传递给您的函数)原则上会解决问题,但是您不能将带参数的函数传递给 cron 库 - 带参数的函数与不带参数的函数类型不同(除此之外,通过添加 () 您实际上是在提前调用该函数并尝试传递其返回值)。

最简单的解决方法是为循环的每次迭代创建一个新变量并避免整个问题,如下所示:

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 循环中的匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28954869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com