首頁 >後端開發 >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 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. 將函數求值並傳回以字串為輸入的函數(求值順序: 1)
  2. fun 函數是用「with Go」來評估的。字串作為輸入(評估順序:2)
  3. fmt.Print("some ") 執行(評估順序:3)
  4. defer 使用fun 的結果呼叫funWithGo 函數(評估順序: 4)

應用Defer 原則

為了解決原始查詢中提到的問題,我們可以使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn