ホームページ > バックエンド開発 > Golang > For ループでジョブをスケジュールするときにクロージャ代入の問題を回避するにはどうすればよいですか?

For ループでジョブをスケジュールするときにクロージャ代入の問題を回避するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-17 18:09:01
オリジナル
591 人が閲覧しました

How to Avoid Closure Assignment Problems When Scheduling Jobs in a For Loop?

「for ループ内の匿名関数に変数を代入できない」におけるクロージャ代入の問題に対処する

タスク スケジューラを構築するコンテキストでは、 for ループ内で変数を匿名関数に代入できないと、意図しない動作が発生する可能性があります。この問題は、匿名関数がスコープ外で定義された変数を取得し、予期しない結果または不正な結果を引き起こす場合に発生します。

前述の特定のシナリオでは、ジョブ名と間隔を含む構成ファイルに基づいてスケジューラが作成されます。各ジョブは「cron」ライブラリを使用してスケジュールされます。これには、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート