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 // Attempt to return new values } }() panic("Report format not recognized.") // ... }
このコードでは、defer関数はパニックが発生すると nil と err を返そうとします。ただし、遅延関数は値を返すことができないため、これは機能しません。代わりに、返されるパラメーター rep と err を defer 関数内で変更する必要があります。
さらに、コード内に型の不一致があります。パニックは文字列で発生しますが、型アサーションではエラーが予期されます。これにより、回復された値をエラーに変換しようとしたときに、プログラムが再びパニックを起こします。
コードを修正するには、以下を行う必要があります。
修正されたコード:
defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // Find out the exact error type and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // Invalidate rep rep = nil } }()
これらの変更により、defer 関数はパニックが発生したときに err と rep が正しく設定されるようになり、呼び出し元の関数がエラーを適切に処理できるようになりました。
以上がGo で遅延関数は値を返すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。