MST

星途 面试题库

面试题:Go语言defer与函数返回值的复杂交互陷阱

考虑以下Go语言函数: ```go func test() (result int) { defer func() { result++ }() return 1 } ``` 请说明该函数的返回值是多少,并详细解释defer语句是如何与函数的返回值交互的。如果将`return 1`改为`result = 1; return`,返回值又会有怎样的变化,原因是什么?
47.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 函数当前形式的返回值及defer语句与返回值的交互
    • 返回值:该函数的返回值是2。
    • defer语句与返回值的交互解释
      • 在Go语言中,return语句并不是原子操作。它实际上分为两步:第一步是给返回值赋值(如果有具名返回值,这里就直接赋值;如果是匿名返回值,会先创建一个临时变量来存储返回值);第二步是执行defer语句,最后才是真正返回。
      • 在这个函数中,result是具名返回值。当执行到return 1时,首先将result赋值为1,然后执行defer语句,defer语句中的result++使得result的值变为2,最后函数返回result的值,所以返回值是2。
  2. return 1改为result = 1; return后的返回值及原因
    • 返回值:返回值依然是2。
    • 原因
      • 这里result = 1先将具名返回值result赋值为1,然后执行return,在执行return前会执行defer语句。defer语句中的result++会将result的值从1增加到2,最后函数返回result的值,所以返回值还是2。本质上和第一种情况类似,都是defer语句在return真正返回前对具名返回值result进行了修改。