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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-24 19:25:13762ブラウズ

How to Fix Closure Issues When Scheduling Jobs in a For Loop?

For ループのクロージャの問題の解決: 変数を匿名関数に割り当てることができない

タスク スケジュールの作成中に問題が発生しましたここで、スケジュールされたジョブは、独自のジョブではなく、最後に反復されたジョブの説明を出力しました。この問題は、for ループ内で匿名関数を使用したことが原因でした。

この問題は、ループ内のすべてのクロージャが同じ変数 (この場合はジョブ変数) を共有していたという事実から発生します。ループを進めるにつれて、変数は次のジョブのデータで上書きされました。

これを解決するために、ジョブ変数を引数として無名関数に渡そうとしましたが、次の理由によりエラーが発生しました。パラメーターのある関数は、パラメーターのない関数とは異なる型を持ちます。

推奨される解決策は、ループの反復ごとに新しい変数 (この場合は realJob) を作成して、各ジョブへの一意の参照を維持することです。そうすることで、クロージャーの問題を回避し、スケジュールされた各ジョブが独自の正しい説明を確実に出力できるようにします。

修正されたコードは次のとおりです:

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 までご連絡ください。