For 루프 및 익명 함수를 사용하여 Go 동시성의 예기치 않은 동작 이해
Go에서 for 루프를 사용하여 익명으로 고루틴을 생성하는 경우 함수를 사용하면 예상치 못한 동작이 발생하여 모든 고루틴이 동일한 값을 인쇄하게 될 수 있습니다. 이 동작을 이해하기 위해 다음 코드를 분석해 보겠습니다.
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
놀랍게도 이 코드는 예상되는 "2, 4, 1, 5," 대신 "6, 6, 6, 6, 6"을 인쇄합니다. 3." 이 예외는 익명 함수에 의해 생성된 클로저로 인해 발생합니다.
Go에서 클로저는 주변 범위에서 변수를 캡처하는 함수입니다. 위 코드에서 각 익명 함수는 변수 i를 캡처합니다. 그러나 for 루프가 반복되면 i는 이미 5입니다. 이는 모든 클로저가 동일한 i 값인 6을 캡처한다는 것을 의미합니다.
이 문제를 해결하려면 i를 인수로 전달할 수 있습니다. 익명 함수. 그렇게 함으로써 우리는 각 클로저에 의해 캡처되는 i의 로컬 복사본을 생성하여 각 고루틴이 올바른 값을 인쇄하도록 보장합니다.
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func(i int) { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }(i) } wg.Wait() }
위 내용은 익명 함수를 사용하는 Go 동시성 루프가 동일한 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!