このコードでは、文字列のスライス (cmds) を反復処理する 2 つの for ループ (loop1 とloop2) を作成します。ただし、これらのループからの結果の出力は異なります。
ループ 1 では、cmds を反復した後、各コマンドが関数にマップされるマップ (アクション) が作成されます。コマンドを出力します。これらの関数が実行されると、すべて cmds の最後の要素である「update」が出力されます。
loop2 では、同様のアプローチが取られますが、保存する代わりにアクション マップ内でコマンドを直接参照すると、そのインデックスを使用してコマンドのコピーが作成されます。これにより、各関数がコマンドの独自のコピーを持つようになり、loop1 からの予期しない「更新」出力が防止されます。
loop1 での特有の動作は、クロージャ (関数が格納されている方法) が原因で発生します。
各関数のループ変数のコピーを作成することにより (loop2 で実行したように)、各関数は後続のループの影響を受けない独自の分離変数を持ちます。
この例では、Golang における変数のスコープの重要性と、ループ変数とコピーによって作成された切り離された変数の区別を強調します。ループ変数を参照するクロージャを扱う場合、変数の再利用による予期せぬ動作を防ぐためにコピーが作成されるようにすることが重要です。
以上がクロージャを使用すると、Golang の For ループが異なる出力を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。