「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パニック回復は、goの関数リテラルのローカル変数を変更できますか?

パニック回復は、goの関数リテラルのローカル変数を変更できますか?

2025-03-22に投稿されました
ブラウズ:205

Can Panic Recovery Modify Local Variables in Function Literals in Go?

は、機能リテラルのローカル変数をパニック回復することができます。ただし、関数リテラルでローカル変数を使用する場合、この動作は一貫性がありません。 defer func(){ e:= recover(); e!= nil { 結果= -1 err = errors.new(e。(string)) } }() バー() 結果= 100 err = nil 戻る } func bar(){ パニック(「パニックが起こった」) }

このコードは予想どおりに機能し、パニックから回復した後、結果の結果を-1に設定し、カスタムエラーメッセージにERRを設定します。ただし、関数リテラル内でローカル変数を使用する場合、動作は次のように変化します。 var result int var errエラー defer func(){ e:= recover(); e!= nil { 結果= -1 err = errors.new(e。(string)) } }() バー() 結果= 100 err = nil 結果を返し、err } func bar(){ パニック(「パニックが起こった」) }

この場合、結果は-1ではなく0にリセットされます。これは、関数リテラルの延期ステートメントが範囲がなくなっているため、指定された返品値にアクセスまたは変更できないためです。

goドキュメントに従って、「...延期関数がリテラルであり、周囲の関数がリテラル内の範囲内のスコープに名前が付けられている場合、defered functionは&& itの前にアクセスし、&& parameredにアクセスする可能性があります。関数リテラル内の延期ステートメントを使用してそれらを変更しようとするときに、名前付きの返品値を使用することが重要です。このような場合のローカル変数にアクセスまたは変更できません。
            
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3