Go でローカル変数を使用したパニック リカバリが戻り値を変更できないのはなぜですか?
提供されたパニック リカバリ コードは、名前付き return を使用すると正常に動作します。値を使用できますが、ローカル変数を使用すると期待どおりに機能しません。この動作を理解するには、defer ステートメントの背後にある基本的な概念を理解することが重要です。
Go ツアーの基本で説明したように、名前付き戻り値は、関数の最初に定義された変数として機能します。ただし、defer ステートメントが関数リテラルを使用し、包含する関数がリテラルのスコープ内に名前付き結果パラメーターを持っている場合、defer 関数は、返される前にこれらのパラメーターにアクセスして変更できます。
ただし、注意することが重要です。 main 関数が完了すると、defer 関数からの戻り値はすべて破棄されます。これは、ローカル変数を含むコードの場合、パニック リカバリ クロージャ内の result 変数と err 変数に加えられた変更が、foo 関数によって返される最終的な戻り値に反映されないことを意味します。
対照的に、名前付き戻り値の場合、変数は実質的に defer 関数の外で定義され、関数内でグローバル スコープを持つため、defer クロージャ内で変数に加えられた変更は関数の完了時に維持されます。
したがって、パニック回復中は名前付き戻り値を変更するために使用できますが、defer ステートメントが関数リテラルおよびパラメーター スコープと対話する方法のため、ローカル変数と同じ動作を実現するために使用することはできません。
以上がPanic Recovery は Go のローカル変数ではなく名前付き戻り値を変更するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。