>  기사  >  백엔드 개발  >  Golang의 Defer 문은 루프에서 변수를 어떻게 캡처합니까?

Golang의 Defer 문은 루프에서 변수를 어떻게 캡처합니까?

DDD
DDD원래의
2024-11-11 22:13:02327검색

How Does Golang's Defer Statement Capture Variables in a Loop?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.