面试题答案
一键面试- 存储方式:
- 在Go语言中,函数的返回值会在栈上分配空间。如果函数声明了具名返回值,这些返回值就像函数内部的局部变量一样,在函数开始执行时就在栈上为它们分配好了空间。例如:
func add(a, b int) (sum int, diff int) {
sum = a + b
diff = a - b
return
}
这里的sum
和diff
在函数开始执行时就在栈上有了对应的存储空间。
- 如果是匿名返回值,同样也是在栈上分配空间,不过没有像具名返回值那样在函数内部有可直接引用的变量名。例如:
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
时,其返回值sum
和diff
(或者匿名返回值对应的计算结果)会被拷贝到main
函数栈帧中为s
和d
分配的空间里。这样就完成了返回值从被调用函数到调用者函数的传递。
总结来说,Go语言函数多值返回时,返回值在栈上存储,通过拷贝传递到调用者的栈帧中。