Go 클로저에서 Defer Capture 매개변수는 어떻게 수행됩니까?

Mary-Kate Olsen
풀어 주다: 2024-11-10 17:53:02
원래의
345명이 탐색했습니다.

How Does Defer Capture Parameters in Go Closures?

매개변수 유무에 관계없이 Go에서 캡처 지연

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: 매개변수 없는 클로저

2부에서는 클로저가 매개변수를 캡처하지 않습니다. 이는 클로저가 실행될 때 변수 i가 defer 문이 실행되었을 때의 값을 갖는다는 것을 의미합니다. 이 경우 i는 for 루프의 마지막 반복 값인 4를 갖게 됩니다. 결과적으로 파트 2의 출력은 다음과 같습니다.

4 4 4 4 4
로그인 후 복사

Part 3: Closure With Parameter

3부에서 클로저는 클로저 생성 시 i 값으로 초기화되는 매개변수 n을 캡처합니다. 이는 클로저가 실행될 때 n이 defer 문이 실행되었을 때의 값을 갖게 된다는 것을 의미합니다. 이 경우 각 클로저는 서로 다른 i 값을 캡처하여 다음과 같이 출력됩니다.

4 3 2 1 0
로그인 후 복사

결론

2부와 3부의 주요 차이점은 2부가 i를 캡처한다는 것입니다. 파트 3은 그렇지 않지만 가변적입니다. 이는 클로저 실행 시 동작에 영향을 미치고 결과가 달라집니다.

위 내용은 Go 클로저에서 Defer Capture 매개변수는 어떻게 수행됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿