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

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

语句 执行 函数 返回 927    来源:    2025-03-15

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

1. return语句的执行

return语句的执行分为两个步骤: - 第一步:计算return语句中的返回值(如果有的话),并将返回值赋值给函数的返回值变量。 - 第二步:执行return语句,结束函数的执行。

2. defer语句的执行

defer语句用于延迟执行一个函数调用,这个调用会在包含它的函数返回之前执行。具体来说: - defer语句会在函数返回之前,按照后进先出(LIFO)的顺序执行。 - 也就是说,最后定义的defer语句会最先执行。

3. 执行顺序

  • 当函数执行到return语句时,首先会计算return语句中的返回值,并将返回值赋值给函数的返回值变量。
  • 然后,函数会检查是否有defer语句,如果有,会按照后进先出的顺序执行这些defer语句。
  • 最后,函数真正返回,结束执行。

4. 示例代码

package main

import "fmt"

func main() {
    fmt.Println(test())
}

func test() (result int) {
    defer func() {
        result++
    }()
    return 1
}

在这个例子中: - return 1语句首先执行,将1赋值给result。 - 然后,defer语句执行,result的值被增加为2。 - 最后,函数返回2

5. 总结

  • return语句首先计算返回值并赋值给返回值变量。
  • 然后,defer语句按照后进先出的顺序执行。
  • 最后,函数返回。

因此,defer语句的执行是在return语句计算返回值之后,但在函数真正返回之前。