패닉 복구로 함수 리터럴의 지역 변수를 수정할 수 있나요?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!