MST

星途 面试题库

面试题:Go defer在函数返回值处理中的特性

在Go语言中,考虑如下代码: ```go func test() (result int) { defer func() { result++ }() return 1 } ``` 请解释为什么该函数返回值是2,并详细说明defer在函数返回值处理过程中的具体作用机制。
19.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 函数返回值为2的原因
    • 在Go语言中,return语句并不是原子操作。当执行到return 1时,会先将返回值1赋值给命名返回值result,此时result的值为1。
    • 然后,函数会执行defer语句中的代码,这里defer语句中的result++会对result进行自增操作,result的值变为2。
    • 最后,函数返回result的值,所以最终返回值是2。
  2. defer在函数返回值处理过程中的作用机制
    • 注册阶段:当函数执行到defer语句时,会将defer后面的函数(这里是func() {result++})压入一个栈中。这个栈是为当前函数调用专门维护的,用于存储所有defer函数。
    • 执行阶段:在函数返回前(准确地说,是在函数的返回值确定之后但真正返回之前),会按照后进先出(LIFO,Last In First Out)的顺序依次执行defer栈中的函数。在这个例子中,当return 1执行后,result已经被赋值为1,然后执行defer中的result++,修改了result的值,最终函数返回修改后的result值。如果有多个defer函数,它们会按照与注册相反的顺序执行。