面试题答案
一键面试闭包概念: 在Go语言中,闭包是一个函数值,它可以引用其函数体之外的变量。闭包允许将函数与其相关的环境(即该函数引用的变量)打包在一起,形成一个独立的实体。即使函数执行完毕,其引用的外部变量也不会被释放,只要闭包还存在,就可以继续访问和修改这些变量。
代码示例:
package main
import "fmt"
// 定义一个返回闭包的函数
func counter() func() int {
i := 0
return func() int {
i++
return i
}
}
使用闭包:
func main() {
c := counter()
fmt.Println(c()) // 输出 1
fmt.Println(c()) // 输出 2
fmt.Println(c()) // 输出 3
}
闭包捕获变量的方式:
在上述代码中,counter
函数返回的闭包 func() int
捕获了 counter
函数内定义的变量 i
。闭包对变量的捕获是通过引用方式进行的。每次调用闭包 c
时,都会访问并修改同一个 i
变量,因为闭包记住了它被创建时的环境,包括对外部变量 i
的引用。所以每次调用 c()
,i
都会自增并返回新的值。