MST

星途 面试题库

面试题:Go语言多值返回在函数调用栈中的体现

在Go语言中,函数可以多值返回。请描述一下多值返回时,在函数调用栈中,返回值是如何存储和传递的?
17.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 存储方式
    • 在Go语言中,函数的返回值会在栈上分配空间。如果函数声明了具名返回值,这些返回值就像函数内部的局部变量一样,在函数开始执行时就在栈上为它们分配好了空间。例如:
func add(a, b int) (sum int, diff int) {
    sum = a + b
    diff = a - b
    return
}

这里的sumdiff在函数开始执行时就在栈上有了对应的存储空间。

  • 如果是匿名返回值,同样也是在栈上分配空间,不过没有像具名返回值那样在函数内部有可直接引用的变量名。例如:
func add(a, b int) (int, int) {
    sum := a + b
    diff := a - b
    return sum, diff
}

这里虽然没有具名返回值,但在栈上还是为这两个返回值分配了空间。 2. 传递过程

  • 当函数执行到return语句时,返回值会被拷贝到调用者的栈帧中。例如有如下调用:
func main() {
    s, d := add(3, 2)
    // 这里s和d接收add函数返回的值
}

add函数执行return时,其返回值sumdiff(或者匿名返回值对应的计算结果)会被拷贝到main函数栈帧中为sd分配的空间里。这样就完成了返回值从被调用函数到调用者函数的传递。

总结来说,Go语言函数多值返回时,返回值在栈上存储,通过拷贝传递到调用者的栈帧中。