在Go语言中,defer 和 return 的执行顺序是一个常见的面试题,也是理解Go语言函数执行流程的关键点之一。以下是它们的执行顺序:
return 的执行过程return 语句的执行可以分为两个步骤:
- 返回值赋值:首先,return 语句会将返回值赋值给函数的返回变量(如果有命名返回值)或临时变量(如果是匿名返回值)。
- 函数返回:然后,函数会执行返回操作,返回到调用者。
defer 的执行时机defer 语句用于延迟执行一个函数调用,这个调用会在包含它的函数返回之前执行。具体来说:
- defer 语句会在 return 语句执行之后、函数真正返回之前执行。
- 如果有多个 defer 语句,它们会按照“后进先出”(LIFO)的顺序执行,即最后一个 defer 语句最先执行。
return 语句执行:首先执行 return 语句,将返回值赋值给返回变量或临时变量。defer 语句执行:然后执行 defer 语句,按照后进先出的顺序执行所有 defer 语句。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())
}
defer 2: 10
defer 1: 11
result: 12
return result 首先将 result 的值设置为 10。defer 语句按照后进先出的顺序执行:
defer 打印 defer 2: 10,并将 result 增加到 11。defer 打印 defer 1: 11,并将 result 增加到 12。12,main 函数打印 result: 12。defer 可以修改返回值。defer 无法修改返回值,因为返回值在 return 语句执行时已经确定。通过理解 defer 和 return 的执行顺序,可以更好地掌握Go语言中函数的执行流程。