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

