在讨论之前,先看如下代码:

 type treeNode struct {
value int
left, right *treeNode
} func createNode(value int) *treeNode {
return &treeNode{value:value}
} func main() {
root := createNode()
fmt.Println(root)
}

上面这段代码createNode函数返回了一个局部变量的地址给main函数中的root,但是fmt.Println正常打印出来了新建的node的内容。这要是在C++中这么写,是个很典型的错误:返回局部变量的地址,该地址的内容在函数退出后会被自动释放,因为是在栈上的。

那么go语言的局部变量到底是在栈上还是堆上呢?go语言编译器会做逃逸分析(escape analysis),分析局部变量的作用域是否逃出函数的作用域,要是没有,那么就放在栈上;要是变量的作用域超出了函数的作用域,那么就自动放在堆上。所以不用担心会不会memory leak,因为go语言有强大的垃圾回收机制。这样可以释放程序员的内存使用限制,让程序员关注程序逻辑本身。

对于new出来的局部变量,也不是一定就放在堆上,而是根据其是否超出了函数作用域来判断是否放在堆上还是栈上。这点和C语言很不一样。

最新文章

  1. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
  2. 《linux命令》ps -aux详细解释
  3. Jmeter常见问题
  4. 神奇的HTML5离线存储(应用程序缓存)
  5. 在CentOS下利用Eclipse调试FFmpeg
  6. phpstorm配置xdebug
  7. Maven聚合
  8. mysql 安装后无法登陆mysql的 shell 那mysql>经验:ERROR 1045 (28000): Access denied for user 'root'@'localhost‘
  9. 重读The C programming Lanuage 笔记一:类型转换
  10. 51nod_1100:斜率最大
  11. FPGA时序约束——理论篇
  12. 第三章· Redis消息队列
  13. 爬虫_拉勾网(selenium)
  14. W3School 学习笔记
  15. Github的简易操作
  16. FPGA内部动态可重置PLL讲解(二)
  17. 日志工具——log4j
  18. MT【127】点对个数两题之一【图论】
  19. XML 和 JSON 的使用场景
  20. dotnet core webapi +vue 搭建前后端完全分离web架构(一)

热门文章

  1. spark的task调度器(FAIR公平调度算法)
  2. 定时杀死warn进程
  3. java nio Files.newDirectoryStream用法
  4. 安卓模拟器Android SDK 4.0.3 R2安装完整图文教程
  5. iOS笔试题01
  6. linux中安装docker
  7. python全栈索引
  8. redis 设置后台守护运行的两种方式
  9. 最新 百合佳缘java校招面经 (含整理过的面试题大全)
  10. 【转载】49个CSS知识点