ホームページ >バックエンド開発 >Golang >Go は For ループ変数を値または変数としてキャプチャしますか?

Go は For ループ変数を値または変数としてキャプチャしますか?

DDD
DDDオリジナル
2024-12-24 01:09:17135ブラウズ

Does Go Capture For-Loop Variables as Values or Variables?

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

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

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