Go에서 캡처한 클로저: 범위 루프 변수 동작 이해
Go에서 for...range 루프는 다른 for-와 다르게 동작합니다. 클로저로 처리되기 때문에 루프가 발생합니다. 이 문서에서는 클로저 변수 내에서 범위 루프 변수 캡처의 미묘한 차이를 살펴봅니다.
범위 루프에서 캡처된 클로저 동작
C#의 foreach 루프와 달리 Go의 for...range 루프는 루프 변수(예: 키 및 값)를 클로저 변수로 캡처합니다. 그러나 Go는 루프 범위에서 이러한 변수를 직접 캡처하지 않습니다. 대신 루프의 클로저 내에서 마지막으로 할당된 값으로 이를 캡처합니다.
이 동작은 예시 코드에서 설명한 것처럼 Go에서 클로저를 사용하여 튜플을 생성하려고 시도할 때 분명해집니다. 클로저는 for...range 루프 중에 k 및 v 변수에 할당된 마지막 값을 캡처하여 잘못된 동작을 초래합니다.
수정: 캡처를 위한 변수 복사
이 문제를 해결하려면 루프 변수를 캡처하기 전에 := 연산자를 사용하여 루프 변수를 로컬 변수에 명시적으로 복사해야 합니다. 클로저.
for k, v := range m { kLocal, vLocal := k, v // Copy values to local variables f[i] = func() { return kLocal, vLocal } }
k와 v를 kLocal과 vLocal에 복사하면 클로저는 이제 for...range 반복 중에 루프 변수에 대해 의도한 값에 올바르게 액세스할 수 있습니다.
클로저와 함수 리터럴
클로저와 함수의 차이점을 알아두는 것이 중요합니다 Go의 리터럴. 함수 리터럴은 현재 범위에 바인딩된 새 함수를 생성하는 반면 클로저는 해당 범위와 공유 변수에 대한 액세스를 유지합니다.
값 루프와 변수 루프
추가로, Go는 값 루프와 변수 루프를 구분합니다. 여기서 값 루프는 루프 변수의 복사본을 각 클로저에 바인딩하고 변수 루프는 실제 루프 변수 자체를 바인딩합니다. 이는 예제 코드에서 관찰된 것처럼 다른 동작으로 이어질 수 있습니다.
결론적으로 Go에서 클로저 내의 범위 루프 변수를 캡처하려면 클로저의 범위와 원하는 값을 복사하기 위한 로컬 변수의 사용에 주의가 필요합니다. 효과적이고 강력한 Go 코드를 작성하려면 이러한 개념을 이해하는 것이 필수적입니다.
위 내용은 Go의 'for...range' 루프는 클로저 변수를 어떻게 처리하고 예기치 않은 동작을 방지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!