defer 關鍵字在Go 中的工作原理
在Go 中,defer 關鍵字允許您延遲函數或語句的執行,直到函數或語句的執行,直到周圍的函數返回。但是,延遲函數的值和參數會立即求值,並在 defer 語句時綁定到函數呼叫。
理解延遲求值順序
例如,以下程式碼:
defer fmt.Println("Your age is:", getAge(age))
延後函數fmt.Println 的執行,並綁定defer 語句時的age值。然而,實際的 fmt.Println 函數呼叫將在周圍函數返回之前以相反的順序執行。
票價計算中的應用程式
在你的例子中,你想根據使用者的年齡計算票價:
defer fmt.Println("Your ticket price is:", printTicket(age, ticketPrice))
這裡,defer語句綁定了defer語句時的age和ticketPrice的值。當主函數傳回時,將使用age和ticketPrice的綁定值來呼叫printTicket。但是,由於僅執行年齡
解決問題
要解決問題,請確保printTicket 中的所有必要條件都會在函數延遲之前進行評估。這是修改後的版本:
defer fmt.Println(*age) if *age <= 13 { ticketPrice = 9.99 } else if *age > 13 && *age < 65 { ticketPrice = 19.99 } else if *age >= 65 { ticketPrice = 12.99 } defer fmt.Println(ticketPrice)
現在,fmt.Println(*age) 和fmt.Println(ticketPrice) 都將被推遲並以相反的順序執行,顯示正確的年齡和票價。
以上是為什麼我的 Defer 語句沒有產生 Go 中的預期票價?的詳細內容。更多資訊請關注PHP中文網其他相關文章!