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

1.11 遍历函数

闭包重写后,需要遍历函数,其逻辑在gc/walk.go文件的walk函数中。在该阶段会识别出声明但是并未被使用的变量,遍历函数中的声明和表达式,将某些代表操作的节点转换为运行时的具体函数执行。例如,获取map中的值会被转换为运行时mapaccess2_fast64函数(详见第8章)。

字符串变量的拼接会被转换为调用运行时concatstrings函数(详见第5章)。对于new操作,如果变量发生了逃逸,那么最终会调用运行时newobject函数将变量分配到堆区。for...range语句会重写为更简单的for语句形式。

在执行walk函数遍历之前,编译器还需要对某些表达式和语句进行重新排序,例如将x/=y替换为x=x/y。根据需要引入临时变量,以确保形式简单,例如x=m[k]或m[k]=x,而k可以寻址。