在 Go 中,defer 关键字用于推迟函数调用的执行,直到周围的函数返回。执行 defer 语句时,延迟调用的参数和函数值会照常计算,但实际函数会在周围函数的 return 语句之前调用。
求值带有 defer 关键字的语句顺序遵循后进先出 (LIFO) 方法。例如,考虑以下代码:
<code class="go">defer func1()() defer func2()() fmt.Println("main function")</code>
在此示例中,对 func1() 的调用将被延迟并在主函数返回之前立即执行。类似地,对 func2() 的调用将被推迟并在调用 func1() 之前执行。
defer 的一个常见用例是在调用 func1() 之前自动释放资源。函数返回。例如,可以在函数开头打开文件句柄,并在函数返回之前使用 defer 关闭文件句柄。
考虑问题中的示例:
<code class="go">defer fmt.Println("Your age is:", getAge(age)) // calls getAge defer fmt.Println("Your ticket price is:", printTicket(age, ticketprice)) // calls printTicket</code>
在此代码中,对 getAge() 的调用被推迟到对 printTicket() 的调用之前。这意味着年龄的评估和ticketPrice的计算将立即发生,而年龄和门票价格的实际打印将推迟到函数返回。
通过使用defer,可以确保年龄即使在函数执行过程中发生错误,也始终打印票价。
问题中的原始代码存在未调用 printTicket 函数的问题对于大于 13 岁的年龄,正确。这是因为 TicketPrice 变量已被声明但从未分配值。通过使用 defer,我们可以确保在打印之前正确计算门票价格。
这是代码的更正版本:
<code class="go">package main import "fmt" func main() { var age int defer fmt.Println("Your age is:", getAge(&age)) defer fmt.Println("Your ticket price is:", printTicket(age)) } func printTicket(age int) float64 { var ticketPrice float64 switch { case age <= 13: ticketPrice = 9.99 case age > 13 && age < 65: ticketPrice = 19.99 case age >= 65: ticketPrice = 12.99 } return ticketPrice } func getAge(age *int) int { fmt.Println("What is your age?") fmt.Scan(age) for *age < 0 || *age > 100 { fmt.Println("That cannot be, please enter your age again") fmt.Scan(age) } return *age }</code>
通过此修复,代码将正确根据用户的年龄打印门票价格。
以上是defer 关键字在 Go 中是如何工作的?它在这个代码示例中解决了什么问题?的详细内容。更多信息请关注PHP中文网其他相关文章!