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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-10 17:53:02406ブラウズ

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

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