名前付きリターンが呼び出し元に正しく提供するパニックを、通常のリターンで隠すことができるのはなぜですか?
Go では、return ステートメントはすべてを初期化します。遅延関数を実行する前に、結果パラメータをゼロ値に戻します。名前付きの結果パラメータがあり、return ステートメントに到達しない場合、これらの名前付きパラメータはゼロ値を保持します。
この動作は、次の例で示されています。
func NormalReturns(n int) error { var err error defer catch(&err) panicIf42(n) return err }
ここでは、 err 変数は nil に初期化されますが、パニックにより return 文に到達しないため nil のままです。 defer catch() が err を変更しても、return ステートメントで空の式リストが指定されているため、この変更は戻り値に反映されません。
対照的に、名前付き return を使用すると、遅延関数が return の後に戻り値を変更できます。ステートメントを実行し、呼び出し元に戻る前に。これは次の関数で例示されています。
func NamedReturns(n int) (err error) { defer catch(&err) panicIf42(n) return }
この場合、err は nil に初期化されますが、関数が戻る前に遅延 catch() によって変更できます。その結果、err に割り当てられたゼロ以外の値が呼び出し元に返されます。
この動作は、名前付きの戻りと通常の戻りの重要な違いを強調します。名前付き戻り値を使用すると、遅延関数は戻り値を変更でき、パニックが発生した場合でも、関連する情報が呼び出し元に確実に伝達されるようにする方法を提供します。
以上がGo の名前付きリターンはパニックを通常のリターンとは異なる方法で処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。