Go での変数の共有: 2 つのケースの違いを理解する
Go では、ゴルーチンは、メモリを共有し、次を使用して通信できる軽量の同時タスクです。チャンネル。ゴルーチン間で変数を共有するには、データ競合の問題を回避するために慎重な処理が必要です。
次の Go プログラムを考えてみましょう:
このプログラムを実行すると、予期された出力が表示されます:
この場合、各ゴルーチンには変数 x の独自のコピーがあり、ゴルーチンの作成時に i の現在の値で初期化されます。これは、x が匿名関数内で宣言されており、そのスコープがその関数に制限されているためです。
次に、プログラムに少し変更を加えてみます。
今回は、出力が
説明は変数 i がゴルーチンで使用される方法にあります。 i は匿名関数の外で宣言されているため、すべてのゴルーチン間で共有されます。この場合、各ゴルーチンが fmt.Println(i) を実行すると、i の最終値である 5 が出力されます。
これを確認するには、x と i のメモリ アドレスの出力を次のように追加します。ゴルーチン。出力は、x がゴルーチンごとに異なるアドレスを持っているのに対し、i はすべてのゴルーチンで同じアドレスを持っていることを示しています:
結論として、2 つの場合の変数共有の違いは、変数のスコープから生じます。無名関数で宣言されています。変数が匿名関数内で宣言されると、その変数はそのゴルーチンにとってプライベートになります。一方、匿名関数の外で宣言された変数は、すべてのゴルーチン間で共有されます。
以上がGo で変数を共有すると、匿名関数内のスコープに応じて異なる出力が得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。