面试题答案
一键面试- 函数
test
的返回值: 函数test
的返回值是2
。 - defer对函数返回值修改的原理:
- 在Go语言中,当函数执行到
return
语句时,会先计算返回值并将其存储到一个临时变量(假设为tmp
)中。这里return 1
会先把1
赋值给result
(因为result
是具名返回值)。 - 然后,函数会执行所有的
defer
语句。defer
语句中的函数会在函数结束前(包括return
语句之后)执行。这里defer func() { result++ }()
会对具名返回值result
进行自增操作,使得result
的值变为2
。 - 最后,函数返回存储在临时变量(这里就是
result
本身,因为具名返回值优化)中的值,所以返回值为2
。
- 在Go语言中,当函数执行到
- 可能存在的陷阱:
- 非具名返回值的情况:如果返回值不是具名的,例如
func test() int { var res int; defer func() { res++ }(); return 1 }
,这里res
是函数内部的局部变量,defer
语句修改的res
不会影响到返回值,函数仍然返回1
。因为非具名返回值在return
时计算的值就直接返回了,defer
修改的局部变量不会改变返回值。 - 多层嵌套
defer
:如果有多层嵌套的defer
语句,要注意执行顺序。defer
语句是后进先出(LIFO)的顺序执行,复杂的嵌套可能导致逻辑难以理解和调试。例如func test() (result int) { defer func() { result++ }(); defer func() { result = result * 2 }(); return 1 }
,这里先执行内层defer
,result
变为2
,再执行外层defer
,result
变为3
,返回值为3
。 defer
中修改外部变量:如果defer
函数中修改的变量是在函数外部定义的,可能会导致意外的行为。例如func test() int { var globalVar int; defer func() { globalVar++ }(); return 1 }
,defer
修改的globalVar
虽然不会影响返回值,但会改变外部变量的值,在多线程环境下可能引发数据竞争等问题。
- 非具名返回值的情况:如果返回值不是具名的,例如