首页 > 后端开发 > Golang > defer 关键字在 Go 中是如何工作的?它在这个代码示例中解决了什么问题?

defer 关键字在 Go 中是如何工作的?它在这个代码示例中解决了什么问题?

DDD
发布: 2024-10-31 16:20:02
原创
682 人浏览过

How does the defer keyword work in Go and what problem does it solve in this code example?

Go 中 Defer 关键字如何工作

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板