MST

星途 面试题库

面试题:Go语言defer执行顺序与函数返回值

在Go语言中,观察下面这段代码,函数`test`的返回值是什么?为什么?defer在这里对返回值产生了怎样的影响? ```go package main import "fmt" func test() int { var a = 5 defer func() { a = a + 5 }() return a } ```
10.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 函数test的返回值
    • 函数test的返回值是5
  2. 原因
    • 在Go语言中,函数的返回值在执行return语句时就已经确定了。当执行到return a时,会将a的值(此时a5)复制到返回值的临时变量中。尽管后续defer函数会修改a的值,但这并不会影响已经确定的返回值。
  3. defer对返回值的影响
    • defer语句中的函数会在函数返回之前执行。但是,由于返回值在return语句执行时就已经确定,defer中的修改操作不会改变返回值。在这个例子中,defer函数将a的值从5修改为10,但返回值仍然是5。如果返回值是命名返回值,情况会有所不同。例如:
package main

import "fmt"

func test() (result int) {
    var a = 5
    defer func() {
        result = result + 5
    }()
    return a
}
  • 在这种情况下,返回值是命名的resultdefer函数会修改result的值,函数最终返回10。因为这里return a实际上等同于result = a; returndefer函数在return语句之前执行,所以可以修改result的值。