Go でのクロージャ呼び出し
Go では、クロージャ本体の後の括弧の使用はクロージャ コンテキストに限定されません。この動作を制御する中心的な概念は、遅延ステートメント内の式は関数呼び出しでなければならないということです。
クロージャを含む関数リテラル
func(ch chan などの関数リテラルを考えてみましょう) int) { ch
Deferred Statements
defer func() { result } などの遅延ステートメント内() では、括弧で囲まれた式が関数呼び出しであることが保証されます。この構文がないと、式は不完全になり、有効な関数呼び出しではなくなります。したがって、遅延ステートメントの構文では、式が関数呼び出しである必要があります。
関数呼び出しとの直交性
この直交性により、遅延ステートメント外の関数呼び出しとの一貫性が保証されます。たとえば、 f() (f は関数値) は、値を返す関数呼び出しを表します。対照的に、括弧のない f は関数値そのものを表します。この並列構文は、遅延ステートメント内の式にも適用されます。
クロージャーの実行
遅延ステートメント内で定義されたクロージャでは、かっこによってクロージャがいつ実行されるかが決まります。たとえば、 defer func() { fmt. Println(i) }() を実行すると、defer ステートメントが見つかるとクロージャがすぐに実行され、i の現在値がキャプチャされます。対照的に、 defer func(n int) { fmt. Println(n) }(i) は、クロージャの実行時ではなく、defer ステートメントの実行時に i の値をキャプチャして出力します。
以上がGo の遅延ステートメントでクロージャ本体の後にかっこが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。