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

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

语句 执行 函数 返回 151    来源:    2025-03-13

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

1. return语句的执行

当函数执行到return语句时,Go会先计算return语句中的返回值,并将这些值存储在函数的返回值区域(即返回值的变量或内存位置)。

2. defer语句的执行

return语句计算完返回值之后,但在函数真正返回之前,Go会执行所有被defer延迟的函数调用。这些defer语句会按照“后进先出”(LIFO)的顺序执行,即最后一个defer语句最先执行。

3. 函数返回

在所有defer语句执行完毕后,函数才会真正返回,控制权交还给调用者。

示例代码

package main

import "fmt"

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

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

执行过程分析

  1. return 1语句执行,将1赋值给result
  2. defer语句执行,result自增,变为2
  3. 函数返回result的值,即2

输出结果

2

总结

  • return语句先计算返回值并存储。
  • defer语句在return之后、函数返回之前执行。
  • defer语句按照“后进先出”的顺序执行。

理解这个顺序对于编写正确的Go代码非常重要,尤其是在处理资源释放、日志记录等场景时。