You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GoLang指针问题:为何f()函数每次调用返回的指针地址都不相同?

问题解答

你观察到的现象是Go的逃逸分析机制导致的,核心原因如下:

  • 你在f()函数内部声明的局部变量v,因为代码里直接返回了它的指针给外部使用,Go编译器会自动判定这个变量的生命周期超出了f()函数本身的栈帧范围,不会把它分配在f()的栈内存上,而是会分配到堆内存。
  • 每调用一次f(),都会完整执行一遍v := 1的初始化逻辑,相当于每次都在堆上申请一块全新的内存来存储这个新的v变量,返回的自然就是不同的内存地址。
  • 你预想的“覆盖旧值”的情况,只有当变量分配在函数栈上时才会出现:函数调用结束后栈帧会被回收,下一次同函数调用会复用同一块栈内存才会覆盖旧值。但这里v已经逃逸到堆上,堆内存的回收由GC统一管理,不会被后续的f()调用直接复用,也就不会出现覆盖旧值的情况。
  • 你代码里的全局变量p是在程序初始化阶段就执行f()得到的结果,和main函数里三次调用f()的时机完全独立,所以它对应的地址也和其他三个都不同。

内容的提问来源于stack exchange,提问作者Deepak Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:45:04