Go 동시성: for 루프에서 익명 함수의 놀라운 동작 탐색
이 탐색에서 우리는 예상치 못한 사실을 밝혀낼 것입니다. for 루프와 익명을 사용할 때 Go 동시성이 나타내는 동작
문제:
sync.WaitGroup을 사용하여 동시성을 테스트하기 위해 다음 코드 조각을 실행한다고 상상해 보세요.
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() }
놀랍게도 출력이 관찰되었습니다. 이전: 예상된 순서 대신 6, 6, 6, 6, 6, 1, 2, 3, 4, 5.
설명:
이 동작을 이해하려면 Go FAQ에서 "고루틴으로 실행되는 클로저는 어떻게 되나요?"를 참조하세요. . 이 시나리오에서는 for 루프가 완료될 때까지 고루틴이 예약되지 않았습니다. 결과적으로 그 시점에서 i는 6으로 발전했습니다. goroutine이 실행될 때 그들은 모두 i의 캡처된 값인 6을 인쇄했습니다.
i를 익명 함수에 인수로 전달하면 효과적으로 현재 값, 호출 당시의 값을 캡처합니다. 이는 수정된 코드 버전에서 관찰되는 예상 동작을 설명합니다.
위 내용은 내 Go 동시성 코드가 1부터 5까지 대신 6을 6번 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!