为了账号安全,请及时绑定邮箱和手机立即绑定

GO 中的关闭和局部变量

GO 中的关闭和局部变量

Go
蝴蝶刀刀 2021-06-15 15:13:45
我在http://en.wikipedia.org/wiki/Closure_(computer_science)找到了以下定义在编程语言中,闭包(也称为词法闭包或函数闭包)是一个函数或对函数的引用以及引用环境——一个存储对每个非局部变量(也称为自由变量或上值)的引用的表那个功能。[1] 闭包——与普通的函数指针不同——允许函数访问那些非局部变量,即使在其直接词法范围之外调用。所有场合都是这样吗?不能 lambda 函数(那些创建闭包的函数)继续引用调用 lambda 时超出范围的局部变量吗?这不是GO的行为吗?PS:我仍然想知道他们为什么使用“lambda”一词为此得到了答案 https://cstheory.stackexchange.com/questions/18443/lambda-term-usage-in-programming
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

引用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 [顶级声明] 闭包)。


查看完整回答
反对 回复 2021-06-21
  • 1 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信