golang에서는 defer 문을 사용하여 일부 오류 처리 및 마무리 작업을 수행합니다. 해당 기능은 Java의 finally 키워드와 유사합니다. 하지만 java의 finally 키워드인지 C++의 Raii 클래스인지는 그 범위와 실행 시점을 명확하게 알 수 있습니다. 그러면 golang에서 defer 키워드로 처리된 내용은 언제 실행되나요?
우선, 공식 문서에 따르면: defer는 함수가 반환되거나, 함수가 종료되거나, 해당 고루틴 패닉이 발생할 때 실행됩니다.
그러면 golang은 다중 값 반환을 지원하기 때문에 반환 값은 반환되기 전에 스택에 푸시되는 반면, C 언어는 반환 값을 레지스터에 저장하고 반환한다는 점에 유의해야 합니다.
golang이 반환할 때 먼저 반환 값을 스택에 푸시한 다음 defer 함수에서 스택의 반환 값을 수정하면(그러나 이렇게 하면 안 됩니다) 반환 값은 다음과 같습니다. 수정되면 점프 리턴이 수행됩니다.
이렇게 하면 defer 실행 시점을 알 수 있습니다. return 훨씬 전에 defer를 적어도 함수가 반환되기 전에 실행됩니다.
한 범위에 여러 개의 defer가 있는 경우 반환 전 실행 순서는 나중에 호출된 defer를 먼저 실행한 다음 이전에 호출된 defer를 실행하는 것입니다.
공식 문서에는 다음과 같이 연기 시점을 잘 설명할 수 있는 몇 가지 예가 있습니다.
lock(l) defer unlock(l) // unlocking happens before surrounding function returns // prints 3 2 1 0 before surrounding function returns for i := 0; i <= 3; i++ { defer fmt.Print(i) } // f returns 1 func f() (result int) { defer func() { result++ }() return 0 }
추천 관련 기사 및 튜토리얼: golang 튜토리얼
위 내용은 defer 키워드는 golang에서 언제 적용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!