MST

星途 面试题库

面试题:Go语言defer执行顺序与函数返回值的复杂关系

在Go语言中,考虑以下函数,它的返回值是什么,解释defer在其中是如何影响返回值的计算和返回过程的。如果将`defer`语句中的`ret++`改为`ret += 2`,返回值又会是什么? ```go package main import "fmt" func test() int { ret := 1 defer func() { ret++ }() return ret } ```
39.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 原函数返回值及defer影响分析
    • 返回值:返回值是2。
    • defer影响过程
      • 当执行到return ret语句时,会先计算返回值,此时ret的值为1,这个1会被暂存起来作为返回值。
      • 然后,函数执行结束前,会执行defer语句,defer语句中的ret++使得ret的值变为2。但最终返回的是之前暂存的1在defer执行完毕后被修改为2(因为defer修改的是同一个ret变量)。所以最终返回2。
  2. defer语句中的ret++改为ret += 2后的返回值
    • 返回值:返回值是3。
    • 分析:当执行到return ret时,ret的值为1被暂存。接着执行defer语句,ret += 2使得ret的值变为3,最终返回的是之前暂存的1在defer执行完毕后被修改为3,所以返回3。