for ループの匿名関数: 予期しない動作
Go プログラムで、スケジューラーが予期した出力を出力していないことがわかりました。スケジュールされたジョブごとに。この問題は、for ループでの匿名関数の使用に起因すると考えられます。
for ループでは、ループが実行されるたびに、匿名関数がループ変数ジョブをキャプチャします。ただし、匿名関数は 1 つだけであるため、ループの最後の反復からのジョブ変数が使用されます。これにより、すべてのジョブで最後のジョブの説明が出力されます。
解決策: 反復ごとに新しい変数を作成する
この問題を解決するには、次の新しい変数を作成します。ループの各繰り返し。これにより、各匿名関数がループ変数の独自の一意の値を確実に取得します。
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 中国語 Web サイトの他の関連記事を参照してください。