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

Go에서 패닉 복구가 함수 리터럴의 지역 변수를 수정할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-10-31 09:18:02375검색

Can Panic Recovery Modify Local Variables in Function Literals in Go?

패닉 복구로 함수 리터럴의 지역 변수를 수정할 수 있나요?

Go에서는 명명된 반환 값으로 작업할 때 defer 문을 사용할 수 있습니다. 값을 반환하기 전에 수정합니다. 그러나 이 동작은 함수 리터럴에서 지역 변수를 사용할 때 일관되지 않습니다.

다음 코드를 고려하세요.

<code class="go">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>

이 코드는 예상대로 작동하며 결과를 -1로 설정하고 err을 a로 설정합니다. 패닉에서 복구한 후 사용자 정의 오류 메시지. 그러나 함수 리터럴 내에서 지역 변수를 사용하면 동작이 변경됩니다.

<code class="go">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>

이 경우 결과는 -1 대신 0으로 재설정됩니다. 이는 함수 리터럴의 defer 문이 더 이상 범위에 속하지 않기 때문에 명명된 반환 값에 액세스하거나 수정할 수 없기 때문입니다.

Go 문서에 따르면, "... 지연된 함수가 함수 리터럴인 경우 주변 함수가 리터럴 내의 범위에 있는 결과 매개 변수의 이름을 지정했다면 지연된 함수는 반환되기 전에 결과 매개 변수에 액세스하고 수정할 수 있습니다."

따라서 시도할 때 명명된 반환 값을 사용하는 것이 중요합니다. 함수 리터럴 내에서 defer 문을 사용하여 수정합니다. 이러한 경우 지역 변수에 접근하거나 수정할 수 없습니다.

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

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