ホームページ >バックエンド開発 >Golang >Go の Defer キーワードは関数の実行順序でどのように機能しますか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 20:32:031051ブラウズ

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

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

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

例: Defer Order の評価

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

<code class="go">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
}</code>

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

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

延期原則の適用

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

<code class="go">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:
        return 9.99
    case age > 13 && age < 65:
        return 19.99
    default:
        return 12.99
    }
}

func getAge(age *int) int {
    fmt.Println("...order is 1...")
    fmt.Print("Enter age=")
    fmt.Scanln(age)
    return *age
}</code>

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

以上がGo の Defer キーワードは関数の実行順序でどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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