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 パラメーターが確実に次のように設定されます。パニック値に基づいて適切なエラーを生成し、不完全なレポートが返されるのを防ぐために rep パラメータも無効にします。
以上がGo 関数でパニックを処理し、リターンを延期する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。