Go의 고루틴 공유 변수 동작
질문:
Go의 동시성 기능을 탐색하는 동안, 개발자가 고루틴 간에 변수를 공유할 때 예상치 못한 동작을 경험했습니다. 특정 코드 수정이 있으면 출력이 완전히 달라졌습니다.
아래 코드 조각에서 각 고루틴은 해당 x 값을 올바르게 인쇄합니다.
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") }
그러나 코드는 모든 고루틴에 대해 균일한 결과를 생성합니다.
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") }
답변:
첫 번째 스니펫에서 각 고루틴에는 변수 x의 새로운 인스턴스가 있습니다. 이는 x := i가 루프 반복마다 새 변수를 생성하기 때문입니다.
이를 입증하기 위해 각 고루틴 내에서 x의 메모리 주소를 인쇄할 수 있습니다.
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") }
이 코드 실행 각 고루틴마다 다른 메모리 주소가 표시됩니다.
두 번째 스니펫에서 변수 i는 go func()에 전달된 익명 함수에서 직접 참조됩니다. 이는 모든 고루틴이 동일한 i 값을 공유한다는 것을 의미하며, 이는 균일한 출력을 설명합니다.
위 내용은 Go에서 변수를 공유할 때 고루틴이 다른 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!