ホームページ > バックエンド開発 > Golang > クロージャを使用すると、Golang の For ループが異なる出力を生成するのはなぜですか?

クロージャを使用すると、Golang の For ループが異なる出力を生成するのはなぜですか?

DDD
リリース: 2024-12-14 19:42:17
オリジナル
412 人が閲覧しました

Why Do Golang's For Loops Produce Different Outputs When Using Closures?

Golang の異なるループの動作を理解する

このコードでは、文字列のスライス (cmds) を反復処理する 2 つの for ループ (loop1 とloop2) を作成します。ただし、これらのループからの結果の出力は異なります。

ループ 1: 予期しない出力

ループ 1 では、cmds を反復した後、各コマンドが関数にマップされるマップ (アクション) が作成されます。コマンドを出力します。これらの関数が実行されると、すべて cmds の最後の要素である「update」が出力されます。

Loop2: Desired Output

loop2 では、同様のアプローチが取られますが、保存する代わりにアクション マップ内でコマンドを直接参照すると、そのインデックスを使用してコマンドのコピーが作成されます。これにより、各関数がコマンドの独自のコピーを持つようになり、loop1 からの予期しない「更新」出力が防止されます。

説明

loop1 での特有の動作は、クロージャ (関数が格納されている方法) が原因で発生します。

  • loop1 では、cmd は各反復で変更されるループ変数です。ループ内で関数が作成されると、関数はこのループ変数を参照します。
  • ただし、ループが完了すると、ループ変数 cmd にはアクセスできなくなり、すべての関数は保持されていた最後の値 (「update」) を参照します。 ).

各関数のループ変数のコピーを作成することにより (loop2 で実行したように)、各関数は後続のループの影響を受けない独自の分離変数を持ちます。

結論

この例では、Golang における変数のスコープの重要性と、ループ変数とコピーによって作成された切り離された変数の区別を強調します。ループ変数を参照するクロージャを扱う場合、変数の再利用による予期せぬ動作を防ぐためにコピーが作成されるようにすることが重要です。

以上がクロージャを使用すると、Golang の For ループが異なる出力を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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