原文:【Golang】是闭包啊..._哔哩哔哩_bilibili
被闭包捕获的变量 要在外层函数和闭包函数中表现一致 好像再使用同一个变量
(一)被捕获的变量除了初始化赋值外,在任何地方都没有被修改过
直接拷贝值到捕获列表中
image.png
(二)被捕获的变量除了初始化赋值外被修改过
1.被捕获的是局部变量
局部变量i改为堆分配 栈上只存一个地址
image.png
2.被捕获的是参数
编译器会把栈上的参数拷贝到堆上一份 外层函数和闭包函数都使用堆上分配的这一个
image.png
3.被捕获的是返回值
调用者栈帧上依然会分返回值空间,闭包的外层函数会在堆上也分配一个 外层函数和闭包函数都使用堆上分配的这一个 但在外层函数返回前 需要把堆上的返回值拷贝到栈上的返回值空间
image.png
处理方式虽然多样,但目标只有一个,就是保持捕获变量在外层函数与闭包函数中的一致性。
网友评论