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中文网其他相关文章!