Named Return이 호출자에게 제공하는 패닉을 일반 반환이 숨기는 이유
Go에서는 일반 반환 문과 명명된 반환 문이 모두 사용됩니다. 함수에서 값을 반환합니다. 그러나 함수 패닉 시 동작에는 미묘한 차이가 있습니다.
일반 반환에서는 함수가 호출될 때 반환 값이 0 값으로 초기화됩니다. 함수가 return 문에 도달하기 전에 패닉이 발생하면 반환 값은 0 값으로 유지됩니다. 예를 들어, 함수가 오류 값을 반환하는 경우 함수가 패닉 상태에 빠지면 일반 반환은 항상 nil을 반환합니다.
반대로 명명된 반환을 사용하면 지연된 함수 또는 이전에 함수 자체에 의해 반환 값을 수정할 수 있습니다. 함수는 호출자에게 반환됩니다. 명명된 반환이 있는 함수에 패닉이 발생하는 경우 지연된 함수는 함수가 호출자에게 반환되기 전에 반환 값을 수정할 수 있습니다.
이 차이점은 다음 예를 통해 설명할 수 있습니다.
package main import ( "fmt" "log" ) func catch(err *error) { if r := recover(); r != nil { *err = fmt.Errorf("recovered panic: %v", r) } } func panicIf42(n int) { if n == 42 { panic("42!") } } func NormalReturns(n int) error { var err error defer catch(&err) panicIf42(n) return err } func NamedReturns(n int) (err error) { defer catch(&err) panicIf42(n) return } func main() { err := NamedReturns(42) log.Printf("NamedReturns error: %v", err) err = NormalReturns(42) log.Printf("NormalReturns error: %v", err) }
출력 이 프로그램의 내용은 다음과 같습니다.
2009/11/10 23:00:00 NamedReturns error: recovered panic: 42! 2009/11/10 23:00:00 NormalReturns error: <nil>
보시다시피 명명된 return은 nil이 아닌 오류를 반환하는 반면 일반 return은 nil을 반환합니다. 이는 NamedReturns 함수의 지연된 catch 함수가 함수가 호출자에게 반환되기 전에 err 반환 값을 수정하기 때문입니다.
이 동작은 프로그램 전체에서 일관된 방식으로 오류를 처리하는 데 유용할 수 있습니다. 명명된 반환을 사용하면 함수가 return 문에 도달하기 전에 패닉이 발생하더라도 패닉이 발생하면 모든 함수가 nil이 아닌 오류를 반환하도록 보장할 수 있습니다.
위 내용은 함수가 패닉 상태일 때 Go의 명명된 반환과 일반 반환은 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!