>백엔드 개발 >Golang >Golang의 고루틴은 어떻게 변수를 공유합니까?

Golang의 고루틴은 어떻게 변수를 공유합니까?

DDD
DDD원래의
2024-11-05 14:11:02551검색

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가 업데이트되어 런타임 시 모든 고루틴이 동일한 값을 참조하게 됩니다.

이 차이점은 Go 동시성에서 변수 범위 지정의 중요성을 강조합니다. 경쟁 조건과 예측할 수 없는 동작을 방지하려면 새 로컬 변수에서 의도한 값을 캡처하는 것이 중요합니다.

위 내용은 Golang의 고루틴은 어떻게 변수를 공유합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.