Go の for ループ変数は、ローカルに割り当てられたクロージャ変数としてキャプチャされませんか?
いいえ、Go でキャプチャされた for ループ変数は、デフォルトでは変数ではなく値としてキャプチャされます。この動作は、値の代わりに変数をキャプチャするために追加の構文が必要な C# などの言語とは異なります。
例: ループ変数を値としてキャプチャする
package main import "fmt" func main() { a := 1 b := func() { fmt.Println(a) } // b captures the value of a, not the variable itself a++ b() // prints 1, not 2 }
この例ではの場合、関数 b は、変数自体への参照を保持するのではなく、定義された時点の a の値を取得します。したがって、b の定義後に a に加えられた変更は、b によって出力される値には反映されません。
例: ループ変数を変数としてキャプチャする
ただし、反映されます。ループ変数ごとに新しいスコープを作成するクロージャ構文を使用して、ループ変数を変数としてキャプチャすることが可能iteration:
package main import "fmt" func main() { a := 1 for a < 10 { b := func() { fmt.Println(a) } // b captures the variable a in a new scope a++ b() // prints 2, 3, 4, ..., 10 } }
この例では、 func キーワードを使用してループの各反復のクロージャーを作成します。この手法により、各クロージャがループ変数への一意の参照を確実にキャプチャし、ループ内で変化する a の値を観察できるようになります。
結論
Goはデフォルトで for ループ変数を値としてキャプチャしますが、for ループ変数を変数としてキャプチャできるクロージャ構文も提供します。この違いを理解することは、混乱を避け、正しく効率的な Go コードを作成するために重要です。
以上がGo は For ループ変数を値または変数としてキャプチャしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。