ホームページ > バックエンド開発 > Golang > Go クロージャはどのようにして for ループ変数を処理し、予期しない動作を防ぐのでしょうか?

Go クロージャはどのようにして for ループ変数を処理し、予期しない動作を防ぐのでしょうか?

Barbara Streisand
リリース: 2024-12-29 08:41:14
オリジナル
765 人が閲覧しました

How Do Go Closures Handle For Loop Variables and Prevent Unexpected Behavior?

Go でのクロージャ (for ループ変数) のキャプチャ

Go の for ループは、ループ変数をループ本体内で変更できない C# の foreach ループとは異なります。 Go では、ループ変数を変更できるため、キャプチャされたクロージャーの動作を別の方法で処理する必要があります。

キャプチャの違い

説明するために、3 つのコードを調べてみましょう。スニペット:

ラボ 1:

l := [](func() (int32, int32)){}
for k, v := range m {
    // Closure captures the last values assigned to k and v from the range
    l = append(l, func() (int32, int32) { return k, v })
}
ログイン後にコピー

ラボ 2:

l := [](func() (int32, int32)){}
for k, v := range m {
    // Closure captures the outer variables k and v (which are modified in the loop)
    l = append(l, func() (int32, int32) { return k, v })
}
ログイン後にコピー

ラボ 3:

l := [](func() (int32, int32)){}
for k, v := range m {
    kLocal, vLocal := k, v // Captures just the values assigned to k and v at the iteration
    l = append(l, func() (int32, int32) { return kLocal, vLocal })
}
ログイン後にコピー

キャプチャ中変数または値

Lab1 と Lab2 では、クロージャはループ本体内のループ変数に割り当てられた最後の値をキャプチャします。ループ変数がループ内で変更されると、不正確な結果が生じる可能性があります。

Lab3 では、正しいアプローチを示します。これは、ローカル変数を使用して、各反復内でループ変数に割り当てられた値を具体的にキャプチャします。この動作は Go のクロージャと一致しており、キャプチャされた変数はデフォルトで参照透過的です。

結論

Go では、for ループ変数のクロージャは参照ではなく値をキャプチャします。ループ中に変更される可能性のある値をキャプチャするには、クロージャに必要な値を割り当てるローカル変数を各反復内で作成する必要があります。このアプローチにより、クロージャ動作が期待どおりであることが保証されます。

以上がGo クロージャはどのようにして for ループ変数を処理し、予期しない動作を防ぐのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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