ホームページ > バックエンド開発 > Golang > Go クロージャでキャプチャ パラメータを延期するにはどうすればよいですか?

Go クロージャでキャプチャ パラメータを延期するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-10 17:53:02
オリジナル
384 人が閲覧しました

How Does Defer Capture Parameters in Go Closures?

パラメーターの有無にかかわらず Go でキャプチャを延期する

Go では、defer キーワードを使用して、周囲の関数が戻るまで関数の実行を延期できます。ただし、匿名クロージャと一緒に使用する場合、クロージャがパラメータを取得する方法に応じて動作が変わる可能性があります。

次のコードを検討してください:

import "fmt"

func main() {
    var whatever [5]struct{}

    for i := range whatever {
        fmt.Println(i)
    } // part 1

    for i := range whatever {
        defer func() { fmt.Println(i) }()
    } // part 2

    for i := range whatever {
        defer func(n int) { fmt.Println(n) }(i)
    } // part 3
}
ログイン後にコピー

パート 2: パラメータなしのクロージャ

パート 2 では、クロージャはパラメータをキャプチャしません。これは、クロージャが実行されると、変数 i には defer ステートメントが実行されたときの値が含まれることを意味します。この場合、 for ループの最後の反復の値は 4 になります。その結果、パート 2 の出力は次のようになります。

4 4 4 4 4
ログイン後にコピー

パート 3: パラメーターによるクロージャ

パート 3 では、クロージャはパラメータ n をキャプチャします。このパラメータは、クロージャの作成時に i の値に初期化されます。これは、クロージャが実行されると、n は defer ステートメントが実行されたときの値を持つことを意味します。この場合、各クロージャは i の異なる値をキャプチャし、次のような出力が得られます。

4 3 2 1 0
ログイン後にコピー

結論

パート 2 とパート 3 の主な違いは、パート 2 が i をキャプチャすることです。変数ですが、パート 3 は変数ではありません。これは、実行時のクロージャの動作に影響を与え、異なる出力をもたらします。

以上がGo クロージャでキャプチャ パラメータを延期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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