Go では、名前付き結果パラメーターを使用して、関数によって返される特定の値を割り当てることができます。関数。ただし、この動作は、名前付き結果パラメータなしで返される関数とは異なるため、疑問が生じる可能性があります。
次のコードを考えてみましょう。NormalReturns と NamedReturns は、パニック時にエラーを返そうとする関数です。
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 }
panicIf42 でパニックが発生すると、エラーが予想されるにもかかわらず、NormalReturns は nil を返します。これは、パニックが呼び出し元に制御を返した後で、遅延キャッチ関数がエラーを割り当てるために発生します。
対照的に、NamedReturns は、名前付き結果パラメーターによって遅延関数が変更できるため、変更された err 値を返します。パニックが発生すると、遅延キャッチ関数によってエラーが割り当てられ、そのエラーは保持され、関数の終了時に返されます。
Return ステートメントの仕様:
"すべての結果値は、関数へのエントリ時にその型のゼロ値に初期化されます。結果を指定する 'return' ステートメントは、遅延関数が実行される前に結果パラメータを設定します。 "
遅延ステートメントの仕様:
"遅延関数は、返される前に結果パラメーターにアクセスして変更することがあります。"
したがって、 NormalReturns では、名前付きの結果パラメーターがないため、戻り値は nil に初期化され、パニック後も nil のままになります。 NamedReturns では、遅延関数が err 結果パラメーターを変更し、その値が返されたエラーとして使用されます。
以上がGo の名前付きリターンと通常のリターン: パニック処理が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。