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
相关产品推荐
相关产品推荐

