Go에서 "defer" 문을 사용하면 함수가 함수 호출의 실행을 다음 시점까지 연기할 수 있습니다. 주변 함수가 반환됩니다. 이 동작은 defer 문이 클로저의 매개변수를 캡처할 때 예상치 못한 결과를 초래할 수 있습니다.
파트 2 대 파트 3: 캡처된 매개변수
다음 코드를 고려하세요.
for i := range whatever { defer func() { fmt.Println(i) }() } // part 2 for i := range whatever { defer func(n int) { fmt.Println(n) }(i) } // part 3
파트 2:
"파트 2"에서 defer 문은 변수 "i"를 캡처하는 클로저를 생성합니다. 클로저가 실행되면 "i" 변수는 range 문의 마지막 반복에서 가졌던 값인 4를 갖게 됩니다. 따라서 출력은 "44444"입니다.
3부:
"3부"에서 defer 문은 외부 변수를 캡처하지 않는 클로저를 생성합니다. 클로저의 "n" 매개변수는 defer 문이 실행될 때 평가되며, 그 순간 "i" 값을 받습니다. 지연된 각 함수 호출이 "n"에 대해 서로 다른 값을 사용하기 때문에 원하는 결과는 "43210"입니다.
핵심 사항:
캡처 이해하기 Go 코드에서 예상치 못한 결과를 방지하려면 defer 문의 동작이 중요합니다.
위 내용은 Go의 'defer' 문은 클로저 매개변수를 어떻게 처리하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!