golang取地址操作采坑:for idx,item := range arr中的item是个独立对象

先看代码:

package main

import "fmt"

func main() {
    type s struct {
        A string
        B int32
    }
    arr := []s{
        {"123", 123},
        {"456", 456},
        {"789", 789},
    }
    m := make(map[string]*s)
    for idx, item := range arr {
        m[item.A] = &item
        fmt.Printf("idx=%d, addr=%p, item addr=%p
", idx, &arr[idx], &item)
    }
    for k, v := range m {
        fmt.Printf("key=%s, v=%+v
", k, v)
    }
}

运行输出:

idx=0, addr=0xc00004e050, item addr=0xc0000044a0
idx=1, addr=0xc00004e068, item addr=0xc0000044a0
idx=2, addr=0xc00004e080, item addr=0xc0000044a0
key=123, v=&{A:789 B:789}
key=456, v=&{A:789 B:789}
key=789, v=&{A:789 B:789}

我傻傻的在循环中取item的地址,结果所有map中的值都指向最后一个!
看来item是一个独立对象,这个对象指向了数组中的对应元素。

是时候静下来认真读《go专家编程》了!

原文地址:https://www.cnblogs.com/ahfuzhang/p/13554985.html