ホームページ >バックエンド開発 >Golang >Go で変数を共有すると、匿名関数内のスコープに応じて異なる出力が得られるのはなぜですか?

Go で変数を共有すると、匿名関数内のスコープに応じて異なる出力が得られるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-07 02:40:02646ブラウズ

Why does sharing variables in Go lead to different outputs depending on their scope within anonymous functions?

Go での変数の共有: 2 つのケースの違いを理解する

Go では、ゴルーチンは、メモリを共有し、次を使用して通信できる軽量の同時タスクです。チャンネル。ゴルーチン間で変数を共有するには、データ競合の問題を回避するために慎重な処理が必要です。

次の Go プログラムを考えてみましょう:

このプログラムを実行すると、予期された出力が表示されます:

この場合、各ゴルーチンには変数 x の独自のコピーがあり、ゴルーチンの作成時に i の現在の値で初期化されます。これは、x が匿名関数内で宣言されており、そのスコープがその関数に制限されているためです。

次に、プログラムに少し変更を加えてみます。

今回は、出力が

説明は変数 i がゴルーチンで使用される方法にあります。 i は匿名関数の外で宣言されているため、すべてのゴルーチン間で共有されます。この場合、各ゴルーチンが fmt.Println(i) を実行すると、i の最終値である 5 が出力されます。

これを確認するには、x と i のメモリ アドレスの出力を次のように追加します。ゴルーチン。出力は、x がゴルーチンごとに異なるアドレスを持っているのに対し、i はすべてのゴルーチンで同じアドレスを持っていることを示しています:

結論として、2 つの場合の変数共有の違いは、変数のスコープから生じます。無名関数で宣言されています。変数が匿名関数内で宣言されると、その変数はそのゴルーチンにとってプライベートになります。一方、匿名関数の外で宣言された変数は、すべてのゴルーチン間で共有されます。

以上がGo で変数を共有すると、匿名関数内のスコープに応じて異なる出力が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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