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 중국어 웹사이트의 기타 관련 기사를 참조하세요!