面试题答案
一键面试-
返回值: 当调用
f := outer(); f()
时,返回的值是1
。 -
defer 语句与闭包之间的交互作用以及对变量生命周期和值的影响:
- defer 语句:
defer
语句会将其后面跟随的函数推迟到包含该defer
语句的函数返回时才执行。在outer
函数中,defer func() { i++ }()
会在outer
函数返回时执行,它会将局部变量i
的值加1
。 - 闭包:闭包是一个函数值,它可以引用其函数体之外的变量。在
outer
函数中,返回的匿名函数func() { return i }
形成了一个闭包,它引用了outer
函数中的局部变量i
。 - 变量生命周期:尽管
outer
函数返回后,其局部作用域会结束,但由于闭包引用了i
,i
的生命周期会延长,直到闭包不再被使用。 - 值的影响:当
outer
函数返回时,defer
语句中的匿名函数func() { i++ }
会执行,此时i
的值加1
。之后,当调用闭包f()
时,它返回的是i
加1
后的值,即1
。
- defer 语句:
-
在 defer 的匿名函数中修改闭包外部的变量对闭包返回的函数的影响:
- 影响:会改变闭包返回函数访问该变量的值。
- 原因:因为闭包引用的是变量本身,而不是变量的副本。在
defer
的匿名函数中修改i
,就直接修改了闭包所引用的i
的值。所以当闭包返回的函数访问i
时,得到的是修改后的值。例如在上述代码中,defer
中的i++
使得闭包返回的函数f()
返回的值为1
而不是初始的0
。