Go语言底层原理剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.7 变量捕获

类型检查阶段完成后,Go语言编译器将对抽象语法树进行分析及重构,从而完成一系列优化。变量捕获主要是针对闭包场景而言的,由于闭包函数中可能引用闭包外的变量,因此变量捕获需要明确在闭包中通过值引用或地址引用的方式来捕获变量。下面的例子中有一个闭包函数,在闭包内引入了闭包外的a、b变量,由于变量a在闭包之后进行了其他赋值操作,因此在闭包中,a、b变量的引用方式会有所不同。在闭包中,必须采取地址引用的方式对变量a进行操作,而对变量b的引用将通过直接值传递的方式进行。

在Go语言编译的过程中,可以通过如下方式查看当前程序闭包变量捕获的情况。从输出中可以看出,a采取ref引用传递的方式,而b采取了值传递的方式。assign=true代表变量a在闭包完成后又进行了赋值操作。

闭包变量捕获的核心逻辑位于gc/closure.go的capturevars函数中。