>  기사  >  백엔드 개발  >  defer 키워드는 golang에서 언제 적용됩니까?

defer 키워드는 golang에서 언제 적용됩니까?

王林
王林원래의
2019-12-09 14:55:392756검색

defer 키워드는 golang에서 언제 적용됩니까?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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