在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
Go 语言支持匿名函数,可作为闭包。匿名函数是一个”内联”语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
闭包也是函数内部通过引用的方式调用外部变量的一种方式。
func f(i int) func() int {
sum := 0
return func() int {
sum+=i
fmt.Println(sum)
return 0
}
}
上面的代码中定义了一个f(i int)
函数,该函数接收一个参数i
,并返回一个函数,返回的函数就是匿名函数,在这个返回的函数中引用了上一个函数中的参数i。
执行结果
a1 := f(5)
a1()
a1()
// 返回
// 5
// 10
-
在每一次执行的时候,sum都会进行增加,这是内函数对外部函数做出的修改,称为引用。
-
即便函数执行完毕,这个变量也不会被销毁,也可以称为“内存泄漏”