MST

星途 面试题库

面试题:Go语言中defer语句在函数返回值赋值前后执行顺序的考察

请分析以下Go代码的输出结果,并解释原因。 ```go package main import "fmt" func test() int { var a int defer func() { a++ fmt.Println("defer1: a = ", a) }() a = 1 defer func() { a++ fmt.Println("defer2: a = ", a) }() return a } func main() { result := test() fmt.Println("main: result = ", result) } ```
47.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 输出结果
    defer2: a =  2
    defer1: a =  3
    main: result =  1
    
  2. 原因分析
    • test函数中,首先声明了变量a并初始化为0。
    • 第一个defer语句会将a++fmt.Println("defer1: a = ", a)压入延迟调用栈。
    • 然后a = 1a赋值为1。
    • 第二个defer语句会将a++fmt.Println("defer2: a = ", a)压入延迟调用栈。
    • 接着执行return a,这里返回的是a的值1,但是此时并不会马上返回,而是先执行延迟调用栈中的函数。
    • 由于延迟调用栈是后进先出(LIFO)的,所以先执行第二个defer语句,a++a的值变为2,输出defer2: a = 2
    • 再执行第一个defer语句,a++a的值变为3,输出defer1: a = 3
    • 最后在main函数中,result接收到test函数返回的值1,输出main: result = 1