defer と名前付き戻り値の相互作用を理解する
Go では、defer ステートメントは関数呼び出しを直前まで延期するための強力なツールとして機能します。囲んでいる関数が終了する前。 Go ブログの例に示すように、この機能を利用して、関数の名前付き戻り値を変更できます。
func c() (i int) { defer func() { i++ }() return 1 }
この例では、defer ステートメントは、名前付き戻り値 i をインクリメントする関数をスケジュールします。周囲の関数 c が戻ります。疑問が生じます: 遅延関数は、外側の関数の戻り値をどのように変更できるでしょうか?
その答えは、Go の return ステートメントの処理にあります。名前付き戻り値を持つ関数では、明示的な引数のない return ステートメントは、それらの名前付き変数の現在の値を戻り値に割り当てます。関数 c の場合、return ステートメント return 1 は i = 1 と同等です。 return.
defer ステートメントを導入する前は、return ステートメントは名前付き変数 i に値 1 を効果的に代入し、すぐに関数から戻ります。ただし、defer ステートメントを使用すると、周囲の関数が戻る前に deferred 関数が呼び出されます。この遅延関数は i をインクリメントし、その値を変更します。その結果、return ステートメントは最終的に i の変更された値 (2) を返します。
この動作は、関数が戻った後に変数値を変更するだけでなく、名前付きの値も変更できる遅延関数の力を示しています。囲んでいる関数の戻り値。
以上がGo で遅延関数は名前付き戻り値をどのように変更できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。