ホームページ  >  記事  >  バックエンド開発  >  Golang のゴルーチンはどのように変数を共有しますか?

Golang のゴルーチンはどのように変数を共有しますか?

DDD
DDDオリジナル
2024-11-05 14:11:02453ブラウズ

How Do Goroutines in Golang Share Variables?

Golang のゴルーチンはどのように変数を共有するのか

Golang の同時実行機能を学ぶとき、興味深い疑問が生じます。ゴルーチンはどのように変数を共有するのでしょうか?簡単な例で微妙な動作を説明します。

例 1

次のコードを考えてみましょう。

<code class="go">package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)

        x := i

        go func() {
            defer wg.Done()
            fmt.Println(x)
        }()
    }

    wg.Wait()
    fmt.Println("Done")
}</code>

出力:

<code class="text">4
0
1
3
2</code>

各ゴルーチンは、意図した値を正しく出力します。

例 2

次に、コードを少し変更してみましょう。

<code class="go">package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)

        go func() {
            defer wg.Done()
            fmt.Println(i)
        }()
    }

    wg.Wait()
    fmt.Println("Done")
}</code>

出力:

<code class="text">5
5
5
5
5</code>

説明

これらの例の違いは、変数 x がゴルーチンによってキャプチャされる方法にあります。例 1 では、新しいローカル変数 x が各ゴルーチン内に作成され、正しい値にアクセスできるようになります。

ただし、例 2 では、ゴルーチンはループ変数である変数 i をキャプチャします。ループが反復されると、i が更新され、すべての goroutine が実行時に同じ値を参照します。

この違いは、Go 同時実行における変数スコープの重要性を強調しています。競合状態や予測不可能な動作を回避するには、新しいローカル変数に意図した値を取り込むことが不可欠です。

以上がGolang のゴルーチンはどのように変数を共有しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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