로컬 변수를 사용한 패닉 복구
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!