「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go の Defer キーワードは関数の実行順序でどのように機能しますか?

Go の Defer キーワードは関数の実行順序でどのように機能しますか?

2024 年 11 月 6 日に公開
ブラウズ:570

How Does Go\'s Defer Keyword Work in Function Execution Order?

Go の defer キーワードの機能を理解する

Go を使用する場合、defer キーワードの動作を理解することが重要です。このキーワードを使用すると、開発者は周囲の関数が戻るまで関数の実行を延期できます。ただし、関数の値とパラメーターは defer ステートメントの実行時に評価されることに注意することが重要です。

例: Defer Order の評価

これを説明するには、次のことを考えてください。コード:

package main

import "fmt"

func main() {
    defer having()(fun("with Go."))
    fmt.Print("some ") // evaluation order: 3
}

func having() func(string) {
    fmt.Print("Go ") // evaluation order: 1
    return funWithGo
}

func fun(msg string) string {
    fmt.Print("have ") // evaluation order: 2
    return msg
}

func funWithGo(msg string) {
    fmt.Println("fun", msg) // evaluation order: 4
}

この例では、コードは次の順序で実行されます。

  1. having 関数が評価され、文字列を入力として受け取る関数が返されます (評価順序: 1)
  2. fun 関数は「with Go」で評価されます。入力として文字列を入力 (評価順序: 2)
  3. fmt.Print("some ") が実行されます (評価順序: 3)
  4. defer は fun の結果で funWithGo 関数を呼び出します (評価順序: 4)

延期原則の適用

元のクエリで言及された問題を解決するには、defer キーワードを使用して、チケット価格に基づいたチケット価格を正しく出力します。入力された年齢に応じて。以下はコードの修正バージョンです:

package main

import "fmt"

func main() {
    age := 999
    defer fmt.Println("Your age is:", getAge(&age)) // defer printing the age
    defer fmt.Println("Your ticket price is:", getTicketPrice(age)) // defer printing the ticket price
}

func getTicketPrice(age int) float64 {
    // Calculate ticket price based on age
    // logic can be customized here
    fmt.Println("...order is 2...")
    switch {
    case age  13 && age 

この修正されたコードでは、defer キーワードを正しく活用して、それぞれの関数の実行後に年齢とチケット価格が確実に出力されるようにし、最初の問題を解決しています。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3