」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 的 Defer 關鍵字如何在函數執行順序中發揮作用?

Go 的 Defer 關鍵字如何在函數執行順序中發揮作用?

發佈於2024-11-06
瀏覽:329

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原則

要解決原始查詢中提到的問題,我們可以使用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