>백엔드 개발 >Golang >Go에서 패닉 복구 중에 Defer 함수가 지역 변수를 수정할 수 있나요?

Go에서 패닉 복구 중에 Defer 함수가 지역 변수를 수정할 수 있나요?

DDD
DDD원래의
2024-10-29 22:45:03833검색

Can Defer Functions Modify Local Variables During Panic Recovery in Go?

로컬 변수를 사용한 패닉 복구

Go에서 defer 함수를 사용한 패닉 복구는 주변 함수 내에서 명명된 반환 값을 수정할 수 있습니다. 그러나 지역 변수가 반환 값으로 사용되는 경우 이 메커니즘은 예상대로 작동하지 않습니다.

지연 함수 내에서 명명된 반환 값(결과 및 오류)이 수정되는 다음 예를 고려하십시오.

<code class="go">func main() {
    result, err := foo()
    fmt.Println("result:", result)
    if err != nil {
        fmt.Println("err:", err)
    }
}

func foo() (result int, err error) {
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()

    result = 100
    err = nil
    return
}

func bar() {
    panic("panic happened")
}</code>

이 코드는 패닉을 복구하고 명명된 반환 값인 result 및 err을 올바르게 수정합니다. 그러나 로컬 변수가 반환 값으로 사용되는 다음 예를 고려하십시오.

<code class="go">func main() {
    result, err := foo()
    fmt.Println("result:", result)
    if err != nil {
        fmt.Println("err:", err)
    }
}

func foo() (int, error) {
    var result int
    var err error
    defer func() {
        if e := recover(); e != nil {
            result = -1
            err = errors.New(e.(string))
        }
    }()
    bar()

    result = 100
    err = nil
    return result, err
}

func bar() {
    panic("panic happened")
}</code>

이 경우 defer 함수는 결과를 수정할 수 없으며 변수에 오류가 발생하여 결과가 0으로 유지되는 예기치 않은 출력이 발생합니다.

이 동작은 defer 문이 주변 함수 자체가 아닌 함수 리터럴에 적용된다는 사실에서 발생합니다. 결과적으로 지역 변수(result 및 err)는 함수 리터럴 내에서 액세스할 수 없습니다. 대조적으로, 명명된 반환 값은 기본적으로 함수 시작 부분에서 초기화되는 변수이기 때문에 함수 리터럴 내에서 액세스할 수 있습니다.

위 내용은 Go에서 패닉 복구 중에 Defer 함수가 지역 변수를 수정할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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