导读|Go的函数调用时参数是通过栈传递还是寄存器传递?使用哪个版本的Go语言能让程序运行性能提升5%?腾讯后台开发工程师涂明光将带你由浅入深了解函数调用,并结合不同版本Go进行实操解答。函数调用基本概念1)调用者caller与被调用者callee如果一个函数调用另外一个函数,那么该函数被称为调用者函数,也叫做caller,而被调用的函数称为被调用者函数,也叫做callee。比如函数main中调用sum函数,那么main就是caller,而sum函数就是callee。2)函数栈和函数栈帧函数执行时需要有足够的内存空间,供它存放局部变量、参数等数据,这段空间对应到虚拟地址空间的栈,也即函数栈。在现代主流机器架构上(例如x86)中,栈都是向下生长的。栈的增长方向是从高位地址到地位地址向下进行增长。分配给一个个函数的栈空间被称为“函数栈帧”。Go语言中函数栈帧布局是这样的:先是调用者caller栈基地址,然后是调用者函数caller的局部变量、接着是被调用函数callee的返回值和参数。然后是被调用者callee的栈帧。注意,栈和栈帧是不一样的。在一个函数调用链中,比如函数A调用B,B调用C,则在函数栈上,A的栈帧在上面,下面依次是B、C的函数栈帧。Go1.17以前的版本,函数栈空间布局如下:函数调用分析通过在centos8上安装gvm,可以方便切换多个Go版本测试不同版本的特性。gvm地址:https://github.com/moovweb/gvm执行:gvm