ホームページ >バックエンド開発 >Golang >クロージャ内の匿名関数が For ループ内の最後のジョブの説明のみを出力するのはなぜですか?

クロージャ内の匿名関数が For ループ内の最後のジョブの説明のみを出力するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-20 18:09:13181ブラウズ

Why Do Anonymous Functions in Closures Print Only the Last Job's Description in For Loops?

クロージャを使用した for ループの匿名関数

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!")
}

この調整により、各ジョブには独自の説明が付けられ、スケジュールされた時刻が到着すると正しく印刷されます。

以上がクロージャ内の匿名関数が For ループ内の最後のジョブの説明のみを出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。