익명 함수를 사용하여 For 루프에서 실행된 Go 고루틴이 모두 동일한 값을 인쇄하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-23 18:22:17
원래의
333명이 탐색했습니다.

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

for 루프 및 익명 함수를 사용한 Go 동시성의 예기치 않은 동작

Go 동시성에서는 실행 시 익명 함수의 동작을 이해하는 것이 필수적입니다. 고루틴으로. 이는 sync.WaitGroup을 사용하여 여러 고루틴이 Amazon S3 업로드를 완료할 때까지 기다리려고 시도할 때 입증되었습니다.

초기 코드에서는 for 루프를 사용하여 고루틴을 시작했지만 출력 결과 놀랍게도 모든 고루틴이 동일한 값을 인쇄하는 것으로 나타났습니다( 6). 이는 for 루프가 완료될 때까지 고루틴이 예약되지 않았기 때문에 발생했으며, 실행 시 i의 값은 6이었습니다.

익명 함수에 i를 인수로 전달하도록 코드가 수정되어 결과는 다음과 같습니다. 원하는 행동. 이는 i를 전달하면 새 변수가 생성되고 호출 시 값을 캡처하기 때문입니다.

이 동작은 익명 함수가 고루틴으로 시작될 때 상태를 캡처한다고 설명하는 Go FAQ와 일치합니다. 생성 당시의 주변 변수. i를 인수로 전달하면 그 순간의 값이 효과적으로 복사됩니다.

따라서 고루틴에서 익명 함수를 사용할 때는 클로저 동작을 고려하고 값 전달과 같은 기술을 사용하여 원하는 동시성 동작을 달성하는 것이 중요합니다.

위 내용은 익명 함수를 사용하여 For 루프에서 실행된 Go 고루틴이 모두 동일한 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿