插件窝 干货文章 Go语言中defer和return的执行顺序是怎样的?

Go语言中defer和return的执行顺序是怎样的?

执行 defer 返回 语句 159    来源:    2025-03-14

在Go语言中,deferreturn 的执行顺序是一个常见的面试题,也是理解Go语言函数执行流程的关键点之一。以下是它们的执行顺序:

1. return 的执行过程

return 语句的执行可以分为两个步骤: - 返回值赋值:首先,return 语句会将返回值赋值给函数的返回变量(如果有命名返回值)或临时变量(如果是匿名返回值)。 - 函数返回:然后,函数会执行返回操作,返回到调用者。

2. defer 的执行时机

defer 语句用于延迟执行一个函数调用,这个调用会在包含它的函数返回之前执行。具体来说: - defer 语句会在 return 语句执行之后、函数真正返回之前执行。 - 如果有多个 defer 语句,它们会按照“后进先出”(LIFO)的顺序执行,即最后一个 defer 语句最先执行。

3. 执行顺序总结

  1. return 语句执行:首先执行 return 语句,将返回值赋值给返回变量或临时变量。
  2. defer 语句执行:然后执行 defer 语句,按照后进先出的顺序执行所有 defer 语句。
  3. 函数返回:最后,函数返回到调用者。

4. 示例代码

package main

import "fmt"

func example() (result int) {
    defer func() {
        fmt.Println("defer 1:", result)
        result++
    }()

    defer func() {
        fmt.Println("defer 2:", result)
        result++
    }()

    result = 10
    return result
}

func main() {
    fmt.Println("result:", example())
}

5. 输出结果

defer 2: 10
defer 1: 11
result: 12

6. 解释

  • return result 首先将 result 的值设置为 10
  • 然后,defer 语句按照后进先出的顺序执行:
    • 第一个 defer 打印 defer 2: 10,并将 result 增加到 11
    • 第二个 defer 打印 defer 1: 11,并将 result 增加到 12
  • 最后,函数返回 12main 函数打印 result: 12

7. 注意事项

  • 如果函数有命名返回值,defer 可以修改返回值。
  • 如果函数没有命名返回值,defer 无法修改返回值,因为返回值在 return 语句执行时已经确定。

通过理解 deferreturn 的执行顺序,可以更好地掌握Go语言中函数的执行流程。