Go 语言中的局部变量是分配在栈区还是堆区
1.栈和堆的区别
栈分配:
- 栈是线程私有的,分配和释放内存由编译器管理。
- 分配速度快,通常用于函数的局部变量。
堆分配:
- 堆是全局共享的,内存的分配和释放由垃圾回收器(GC)管理。
- 适用于动态分配和长生命周期的内存,但性能较慢。
2.解答
Go 语言中的局部变量既可能分配在栈上,也可能分配在堆上
如果变量的生命周期局限于函数作用域,并且不会逃逸到函数外,则分配在栈上。
如果局部变量的生命周期超出函数作用域(如通过指针返回给外部使用),编译器会将变量分配在堆上,确保变量在作用域外仍然有效。
3.总结
当变量仅在局部作用域使用的时候,不会发生内存逃逸。
内存逃逸的场景:
- 指针逃逸
- 接口类型逃逸
- 切片扩容逃逸
- 闭包捕获变量,变量的作用域发生变化
- 大对象逃逸
- channel 发送
- 方法值捕获
- 函数参数逃逸