ホームページ  >  記事  >  バックエンド開発  >  Go の「for」ループ内の匿名関数がループ変数の最終値を取得するのはなぜですか?

Go の「for」ループ内の匿名関数がループ変数の最終値を取得するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-19 03:49:03780ブラウズ

Why Do Anonymous Functions in Go's `for` Loops Capture the Final Value of the Loop Variable?

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 サイトの他の関連記事を参照してください。

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