for 루프 및 익명 함수를 사용한 Go 동시성의 예기치 않은 동작
Go 동시성에서는 실행 시 익명 함수의 동작을 이해하는 것이 필수적입니다. 고루틴으로. 이는 sync.WaitGroup을 사용하여 여러 고루틴이 Amazon S3 업로드를 완료할 때까지 기다리려고 시도할 때 입증되었습니다.
초기 코드에서는 for 루프를 사용하여 고루틴을 시작했지만 출력 결과 놀랍게도 모든 고루틴이 동일한 값을 인쇄하는 것으로 나타났습니다( 6). 이는 for 루프가 완료될 때까지 고루틴이 예약되지 않았기 때문에 발생했으며, 실행 시 i의 값은 6이었습니다.
익명 함수에 i를 인수로 전달하도록 코드가 수정되어 결과는 다음과 같습니다. 원하는 행동. 이는 i를 전달하면 새 변수가 생성되고 호출 시 값을 캡처하기 때문입니다.
이 동작은 익명 함수가 고루틴으로 시작될 때 상태를 캡처한다고 설명하는 Go FAQ와 일치합니다. 생성 당시의 주변 변수. i를 인수로 전달하면 그 순간의 값이 효과적으로 복사됩니다.
따라서 고루틴에서 익명 함수를 사용할 때는 클로저 동작을 고려하고 값 전달과 같은 기술을 사용하여 원하는 동시성 동작을 달성하는 것이 중요합니다.
위 내용은 익명 함수를 사용하여 For 루프에서 실행된 Go 고루틴이 모두 동일한 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!