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

Go语言遍历map时key和value的内存地址为何每次循环均相同?

问题原因

该现象是Go语言for range循环的固有设计导致的,核心逻辑是迭代变量复用:

  • 循环头部定义的key、value是在循环启动前就完成内存分配的临时变量,整轮循环只会初始化这一次
  • 每轮遍历仅会将map对应键、值的内容拷贝赋值给这两个固定的临时变量,不会为每一轮迭代重新分配新的key、value内存空间
  • 所以你打印的&key、&value始终是同一个内存地址,仅地址中存储的内容会跟随迭代更新。

注意事项

这个设计很容易引发隐性BUG:如果在循环内直接将&key、&value存入外部存储结构,最终所有存储的指针都会指向最后一轮迭代的key/value值。
如果需要保留每一轮key/value的独立指针,可以在循环内部声明局部变量中转:

for key, value := range myMap {
    // 每轮循环创建独立的局部变量,分配新的内存地址
    k, v := key, value
    fmt.Printf("独立Key地址: %p %v\n", &k, k)
    fmt.Printf("独立Value地址: %p %v\n", &v, v)
}

内容的提问来源于stack exchange,提问作者chris.mclennon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:09:02