4

我在http://en.wikipedia.org/wiki/Closure_(computer_science)找到了以下定义

在编程语言中,闭包(也称为词法闭包或函数闭包)是函数或对函数的引用以及引用环境——<strong>存储对每个非局部变量(也称为自由变量或upvalues)该函数。 [1] 与普通函数指针不同,闭包允许函数访问这些非局部变量,即使在其直接词法范围之外调用也是如此。

在所有场合都是如此吗?lambda函数(那些创建闭包)不能继续对调用lambda时超出范围的局部变量进行裁判吗?这不是GO的行为吗?


PS:我仍然想知道他们为什么使用“lambda”术语

为此得到了答案 https://cstheory.stackexchange.com/questions/18443/lambda-term-usage-in-programming


以下帖子可能会对其他读者有所帮助,

“闭包”和“lambda”有什么区别?

4

1 回答 1

6

引用Go 语言规范

函数字面量

函数字面量表示匿名函数。

FunctionLit = "func" Function .
func(a, b int, z float64) bool { return a*b < int(z) }

函数文字可以分配给变量或直接调用。

f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)

函数字面量是闭包:它们可以引用在周围函数中定义的变量。然后,这些变量在周围的函数和函数字面量之间共享,只要它们可以访问,它们就会继续存在。

所以是的,在 Go 中,保证闭包可以访问在定义函数字面量的范围内可见的任何变量。Go 编译器识别范围内“捕获”的变量并将它们强制到堆而不是定义的上下文堆栈(如果有的话 - 也可以是 TLD [顶级声明] 闭包)。

于 2013-07-24T10:13:33.460 回答