Go에서 반환 연기
Go에서 defer 문을 사용하면 주변 함수가 반환될 때까지 함수 실행을 연기할 수 있습니다. 이를 통해 런타임 중에 복구할 수 없는 오류가 발생할 때 발생할 수 있는 패닉 상황에서도 정리 작업을 실행할 수 있습니다.
패닉이 발생한 경우 함수에서 오류를 반환하려고 시도하는 다음 코드 조각을 고려하세요.
func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err } }() panic("Report format not recognized.") // rest of the getReport function }
그런데 이 코드는 의도한 대로 작동하지 않습니다. 지연된 함수 내의 return 문은 함수 내의 지역 변수 err 및 rep만 수정하고 실제로 함수 외부에서는 이를 반환하지 않습니다.
이 문제를 해결하려면 지연된 함수 내부의 복구 함수를 사용하여 다음을 수행할 수 있습니다. 패닉 값을 검색하고 그에 따라 err 매개변수를 설정합니다. 또한 패닉 값의 유형을 확인하고 필요한 경우 이를 오류로 변환해야 합니다.
업데이트된 코드는 다음과 같습니다.
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } rep = nil } }()
이 코드는 err 매개변수가 다음으로 설정되도록 합니다. 패닉 값을 기반으로 적절한 오류를 확인하고, 불완전한 보고서 반환을 방지하기 위해 담당자 매개변수도 무효화합니다.
위 내용은 Go 함수에서 패닉을 처리하고 반환을 연기하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!