MST

星途 面试题库

面试题:Go语言defer语句与闭包的复杂交互

考虑以下代码: ```go func outer() func() { var i int defer func() { i++ }() return func() { return i } } ``` 当调用`f := outer(); f()`时,返回的值是多少?详细解释defer语句与闭包之间的交互作用以及这种交互对变量生命周期和值的影响。如果在defer的匿名函数中修改闭包外部的变量,会对闭包返回的函数产生怎样的影响,为什么?
27.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 返回值: 当调用 f := outer(); f() 时,返回的值是 1

  2. defer 语句与闭包之间的交互作用以及对变量生命周期和值的影响

    • defer 语句defer 语句会将其后面跟随的函数推迟到包含该 defer 语句的函数返回时才执行。在 outer 函数中,defer func() { i++ }() 会在 outer 函数返回时执行,它会将局部变量 i 的值加 1
    • 闭包:闭包是一个函数值,它可以引用其函数体之外的变量。在 outer 函数中,返回的匿名函数 func() { return i } 形成了一个闭包,它引用了 outer 函数中的局部变量 i
    • 变量生命周期:尽管 outer 函数返回后,其局部作用域会结束,但由于闭包引用了 ii 的生命周期会延长,直到闭包不再被使用。
    • 值的影响:当 outer 函数返回时,defer 语句中的匿名函数 func() { i++ } 会执行,此时 i 的值加 1。之后,当调用闭包 f() 时,它返回的是 i1 后的值,即 1
  3. 在 defer 的匿名函数中修改闭包外部的变量对闭包返回的函数的影响

    • 影响:会改变闭包返回函数访问该变量的值。
    • 原因:因为闭包引用的是变量本身,而不是变量的副本。在 defer 的匿名函数中修改 i,就直接修改了闭包所引用的 i 的值。所以当闭包返回的函数访问 i 时,得到的是修改后的值。例如在上述代码中,defer 中的 i++ 使得闭包返回的函数 f() 返回的值为 1 而不是初始的 0