Go에서는 defer 키워드를 사용하여 주변 함수가 반환될 때까지 함수 실행을 연기할 수 있습니다. 그러나 익명 클로저와 함께 사용할 경우 클로저가 매개변수를 캡처하는 방법에 따라 동작이 달라질 수 있습니다.
다음 코드를 고려하세요.
import "fmt" func main() { var whatever [5]struct{} for i := range whatever { fmt.Println(i) } // part 1 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부에서는 클로저가 매개변수를 캡처하지 않습니다. 이는 클로저가 실행될 때 변수 i가 defer 문이 실행되었을 때의 값을 갖는다는 것을 의미합니다. 이 경우 i는 for 루프의 마지막 반복 값인 4를 갖게 됩니다. 결과적으로 파트 2의 출력은 다음과 같습니다.
4 4 4 4 4
3부에서 클로저는 클로저 생성 시 i 값으로 초기화되는 매개변수 n을 캡처합니다. 이는 클로저가 실행될 때 n이 defer 문이 실행되었을 때의 값을 갖게 된다는 것을 의미합니다. 이 경우 각 클로저는 서로 다른 i 값을 캡처하여 다음과 같이 출력됩니다.
4 3 2 1 0
2부와 3부의 주요 차이점은 2부가 i를 캡처한다는 것입니다. 파트 3은 그렇지 않지만 가변적입니다. 이는 클로저 실행 시 동작에 영향을 미치고 결과가 달라집니다.
위 내용은 Go 클로저에서 Defer Capture 매개변수는 어떻게 수행됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!