ホームページ > バックエンド開発 > Golang > Go におけるクロージャとパラメータ: 匿名関数にどちらを使用する場合?

Go におけるクロージャとパラメータ: 匿名関数にどちらを使用する場合?

DDD
リリース: 2024-11-30 05:47:14
オリジナル
697 人が閲覧しました

Closures vs Parameters in Go: When to Use Which for Anonymous Functions?

パラメータとクロージャ: ニュアンスの詳細

Go では、クロージャと関数パラメータは、匿名関数内の変数を処理するための個別のメカニズムを提供します。ニュアンスを詳しく調べて、一方のアプローチが他方のアプローチよりも優れている場合を調べてみましょう。

クロージャー: 共有変数アクセス

匿名関数がクロージャーとして機能する場合、匿名関数は、で定義された変数へのアクセスを保持します。周囲の範囲。これらの変数はクロージャのすべてのインスタンス間で共有されます。つまり、同じメモリ アドレスを参照します。これは、累計の維持やカウンターの増分など、同じデータに対して複数の関数呼び出しを実行する場合に有利です。

関数パラメータ: 値のコピー

対照的に、パラメータを匿名関数に渡すと、関数は値のコピーを受け取ります。これは、関数の各インスタンスが、呼び出しスコープから分離された、変数の独自のコピーを持つことを意味します。これは、元の値に影響を与えることなく、各関数呼び出しを独立して動作させたい場合に役立ちます。

正しいアプローチの選択

クロージャを使用するか関数パラメータを使用するかの選択は、意図する動作によって異なります。 。すべての関数呼び出しで同じ変数とその変更を共有する必要がある場合は、クロージャの方が適切です。一方、各関数呼び出しが変数の独自のコピーを操作する必要がある場合は、パラメーターを使用する必要があります。

この違いを説明するには、次のことを考慮してください。例:

クロージャ:

for i := 0; i < 3; i++ {
    go func() {
        fmt.Println(i)
    }()
}
ログイン後にコピー

パラメータ:

for i := 0; i < 3; i++ {
    go func(v int) {
        fmt.Println(v)
    }(i)
}
ログイン後にコピー

クロージャの例では、すべての関数呼び出しは同じ共有変数 i にアクセスします。ゴルーチンの実行時の最終値は 3 になります。これにより、出力 3 が 3 回出力されます。

ただし、関数パラメーターの例では、各関数呼び出しは呼び出し時に変数 i のコピーを受け取ります。したがって、各ゴルーチンは引数として渡された時点の i の値を出力するため、出力は 0、1、2 になります。

以上がGo におけるクロージャとパラメータ: 匿名関数にどちらを使用する場合?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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