golang 定义的局部变量是在栈中还是堆中?
2021-05-22 本文已影响0人
我爱张智容
先看这两个代码:
image.png image.png
这两段代码只是调用的打印函数不一样,但是局部变量一个放在堆中,一个是放在栈中的。
直接说原因:go语言编译器会做逃逸分析,分析局部变量的作用域是否逃出了函数的作用域,要是没有就放到栈上,要是超出了函数的作用域就自动放到堆上。fmt.println函数使局部变量的作用域超出了函数的作用域,所以局部变量是在堆上。而println是内联函数,并没有使局部变量的作用域逃出函数的作用域,所以是在栈上。