Golang의 Defer 문에서 클로저 캡처
Golang의 defer 문을 사용하면 함수 반환 후 정리 작업을 실행할 수 있습니다. 그러나 대부분의 언어와 달리 defer에 의해 생성된 클로저는 주변 함수에 있는 변수의 현재 상태를 캡처하지 않고 대신 defer 문이 실행될 때 이를 평가합니다.
2부와 부분 이해하기 3
주어진 코드에서 파트 2와 파트 3의 차이점은 클로저가 변수 i를 캡처하는 방법에 있습니다.
파트 2:
for i := range whatever { defer func() { fmt.Println(i) }() }
Part 2에서는 클로저가 변수 i를 직접 캡처합니다. 클로저의 코드가 실행되면(루프가 완료된 후) i 값은 루프의 최종 반복인 4에 의해 결정됩니다. 이것이 파트 2에서 "44444"를 출력하는 이유입니다.
3부:
for i := range whatever { defer func(n int) { fmt.Println(n) }(i) }
3부에서 클로저는 i를 직접 캡처하지 않고 대신 새 변수 n을 생성하고 defer 문이 실행될 때 i 값을 할당합니다. . defer 문은 루프가 반복될 때마다 실행되므로 각 클로저는 n에 대해 서로 다른 값을 갖습니다. 결과적으로 "43210"이 출력됩니다.
핵심 사항:
기억해야 할 핵심 개념은 defer의 클로저 내의 코드가 defer가 실행될 때 실행되지 않는다는 것입니다. 명령문이 실행됩니다. 대신, 클로저의 인수를 결정하는 데 사용되는 표현식(예: 이 경우 i)은 defer 문이 실행될 때 평가됩니다.
위 내용은 Golang의 Defer 문은 루프에서 변수를 어떻게 캡처합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!