ホームページ >バックエンド開発 >Golang >Go は遅延関数呼び出しの引数評価をどのように処理しますか?

Go は遅延関数呼び出しの引数評価をどのように処理しますか?

DDD
DDDオリジナル
2024-12-10 06:57:16731ブラウズ

How Does Go Handle Deferred Function Call Argument Evaluation?

遅延呼び出し引数の評価について

Go では、「defer」ステートメントは、呼び出しの最後に特定のアクションが確実に実行されるようにするためによく使用されます。周囲の関数。ただし、遅延呼び出しに渡された引数はすぐには実行されないことに注意することが重要です。

Go 仕様によると、「'defer' ステートメントが実行されるたびに、関数の値とパラメーターが呼び出しに渡されます」通常どおり評価され、新たに保存されますが、実際の関数は呼び出されません。

詳しく説明すると、遅延される関数 (「遅延関数」) とそれに関連する関数です。パラメータはすぐに評価されます。ただし、遅延関数の実際の実行は、周囲の関数が完了するまで遅延されます。

例の説明

次の Go コードを考えてみましょう。

func def(s string) func() {
    fmt.Println("tier up")
    fmt.Println(s)
    return func(){ fmt.Println("clean up") }
}

func main() {
    defer def("defered line")()
    fmt.Println("main")
}

この例:

  • 遅延関数の値(def("defered line")) が評価されます。これには、引数 "defered line" を指定して def を呼び出すことが含まれます。これにより、「tier up」と引数が出力されます。
  • 匿名関数である def の戻り値は延期されますが、まだ実行されていません。
  • メインの残りのコード (fmt.Println) ("main")) が実行されます。
  • main が戻ると、遅延関数が実行され、「clean」が出力されます。 up".

したがって、遅延関数呼び出しの引数 (この場合は「遅延行」) は、defer ステートメントが実行されるとすぐに評価され、後で実行できるように関数とその引数を設定します。

以上がGo は遅延関数呼び出しの引数評価をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。