名前付き戻り値と遅延関数の相互作用
Go では、名前付き戻り値を使用すると、関数が位置指定を使用する代わりに名前で戻り値を指定できるようになります。引数。次の例に見られるように、名前付き戻り値と遅延関数の間の相互作用は混乱を招く可能性があります:
func c() (i int) { defer func() { i++ }() return 1 }
ドキュメントによると、この関数は 2 を返すことが期待されています。「遅延関数は読み取りおよび割り当てを行う可能性があります。」返される関数の名前付き戻り値。」ただし、この場合、関数は 1 を返します。これはドキュメントと矛盾しているようです。
この動作を理解するには、引数のない return ステートメントは「裸の戻り値」として知られる名前付きの戻り値を返すことを覚えておくことが重要です。 " 戻る。コード例では、戻り値を明示的に 1 に割り当てる return 1 を使用しているため、1 が返されます。
遅延関数は return ステートメントの後に実行され、i がインクリメントされます。ただし、この増分は、新しい値を遅延関数内のローカル変数に効果的に割り当てるため、名前付き戻り値 i には影響しません。
これは、戻り値 1 が次と同等であるためです。
i = 1 return
名前付き戻り値変数 i を持つ関数では、代入 i = 1 によって名前付き戻り値が設定されますが、return ステートメントは単純に関数を終了し、遅延関数が実行してローカル関数を変更できるようにします。 i 変数は、名前付きの戻り値に影響を与えません。
したがって、i をインクリメントする遅延関数の使用にもかかわらず、関数 c は実際には 1 を返します。
以上がGo で遅延関数が名前付き戻り値をインクリメントできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。