Go では、defer ステートメントは、周囲のステートメントの後に実行される関数をスケジュールするために使用されます。関数が戻ります。ただし、遅延関数内の変数値にアクセスして変更する場合、変数の宣言方法によって動作が異なる場合があります。
ケース 1: 受信パラメータとして宣言された変数
次の例を考えてみましょう:
func c(i int) int { defer func() { i++ }() return i }
ここで、i は次のように宣言されています。受信パラメータ。 return ステートメントが実行されると、戻り値が評価され、遅延関数がこの後に実行されます。その結果、遅延関数で i をインクリメントしても戻り値には影響せず、c(0) は 0 を出力します。
ケース 2: 結果パラメーターとして宣言された変数
次に、この例を見てみましょう:
func c1() (i int) { defer func() { i++ }() return i }
この場合、 i は宣言されています結果パラメータの名前として。 return ステートメントが実行されると、i の値が明示的に返されます。その後、遅延関数は i の値を変更できるようになり、実際の戻り値に影響を与えます。これが、c1() が 1 を出力する理由です。
ケース 3: 明示的な戻り値を持つ結果パラメーター
さらに詳しく説明するために、次の例を考えてみましょう。
func c2() (i int) { defer func() { i++ }() return 2 }
ここでは、defer 関数が i を変更しているにもかかわらず、明示的な return ステートメントは defer の前に i に値 2 を代入しています。関数が実行されます。結果として、c2() は 3 を返します。
結論
重要なポイントは、Go では、関数に名前付きの結果パラメーターがある場合、戻り値はそれらの変数の値。ただし、return ステートメントはこれらの結果パラメータに新しい値を割り当てる可能性があり、遅延関数は return ステートメントの後でそれらを変更し、実際の戻り値に影響を与える可能性があります。
以上がGo の `defer` ステートメントは変数宣言に基づく戻り値にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。