首页 >后端开发 >Golang >Go 的 Defer 关键字如何在函数执行顺序中发挥作用?

Go 的 Defer 关键字如何在函数执行顺序中发挥作用?

Susan Sarandon
Susan Sarandon原创
2024-10-29 20:32:031054浏览

How Does Go's Defer Keyword Work in Function Execution Order?

理解 Go 的 Defer 关键字的功能

在使用 Go 时,理解 defer 关键字的行为至关重要。该关键字允许开发人员推迟函数的执行,直到周围的函数返回。但是,请务必注意,执行 defer 语句时会评估函数的值和参数。

示例:评估 Defer Order

为了说明这一点,请考虑以下内容代码:

<code class="go">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
}</code>

在此示例中,代码按以下顺序执行:

  1. 对函数进行求值并返回一个以字符串作为输入的函数(求值顺序: 1)
  2. fun 函数是用“with Go”来评估的。字符串作为输入(评估顺序:2)
  3. fmt.Print("some ") 被执行(评估顺序:3)
  4. defer 使用 fun 的结果调用 funWithGo 函数(评估顺序: 4)

应用 Defer 原则

为了解决原始查询中提到的问题,我们可以使用 defer 关键字来正确打印基于票价的票价关于输入的年龄。下面是代码的修改版本:

<code class="go">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:
        return 9.99
    case age > 13 && age < 65:
        return 19.99
    default:
        return 12.99
    }
}

func getAge(age *int) int {
    fmt.Println("...order is 1...")
    fmt.Print("Enter age=")
    fmt.Scanln(age)
    return *age
}</code>

在这个修改后的代码中,我们正确地利用了 defer 关键字来确保年龄和票价在相应函数执行后打印,解决了最初的问题.

以上是Go 的 Defer 关键字如何在函数执行顺序中发挥作用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn