defer を使用した Golang の機能変更を理解する
Golang では、defer を使用すると、開発者は関数の終了後に実行する関数を設定して post を有効にすることができます。 - 実行のクリーンアップ。ただし、同じ関数内でさまざまな方法で宣言された変数値を変更しようとすると、問題が発生する可能性があります。
次のコード例を考えてみましょう。
func c(i int) int { defer func() { i++ }() return i } func c1() (i int) { defer func() { i++ }() return i } func c2() (i int) { defer func() { i++ }() return 2 }
In c(0), due to i入力パラメータであるため、戻り値は遅延増分の影響を受けず、印刷出力は 0 になります。
c1() では、i は次のとおりです。名前付き結果パラメータ。遅延関数の実行前に戻り値が明示的に割り当てられます。したがって、遅延増分は戻り値に影響し、出力は 1 になります。
ただし、c2() では、i が明示的に 2 として返される場合でも、遅延増分によって結果パラメーターが変更され、結果が返されます。値 3。
仕様では、この動作を明確にしています:
Return ステートメント:
「return」ステートメント結果を指定すると、遅延関数が実行される前に結果パラメーターが設定されます。
名前付き結果パラメーターを持つ関数の場合、戻り値は常にそれらの変数の値ですが、return ステートメントはこれらのパラメーターに新しい値を割り当てることができます。遅延関数は、return ステートメントの後でこれらのパラメータをさらに変更できます。
この原則は関数とメソッドの両方に適用され、遅延関数は名前付き結果パラメータが返される前にアクセスして変更できます。したがって、変数宣言と遅延関数の変更が最終的な戻り値にどのような影響を与えるかを考慮することが重要です。
以上が`defer` ステートメントは変数宣言に基づいて Go の戻り値にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。