>백엔드 개발 >Golang >Go의 'defer' 문은 클로저 매개변수를 어떻게 처리하나요?

Go의 'defer' 문은 클로저 매개변수를 어떻게 처리하나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-11 22:08:02697검색

How Does Go's `defer` Statement Handle Closure Parameters?

Go의 "defer" 클로저: 클로저의 매개변수 캡처 이해

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"입니다.

핵심 사항:

  • Defer 문 주변 함수가 반환될 때까지 함수 호출 실행을 지연합니다.
  • 클로저가 매개변수를 캡처하면 매개변수의 값은 클로저 생성 시 고정됩니다.
  • 클로저가 캡처하지 않는 경우 외부 변수인 경우 해당 매개변수는 defer 문이 실행될 때 평가됩니다.
  • defer 문의 실행 순서는 LIFO(후입선출)입니다.

캡처 이해하기 Go 코드에서 예상치 못한 결과를 방지하려면 defer 문의 동작이 중요합니다.

위 내용은 Go의 'defer' 문은 클로저 매개변수를 어떻게 처리하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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