关于go:访问地图中的结构(不复制)


Access Struct in Map (without copying)

假设跟随

1
2
3
4
5
6
7
type User struct {
    name string
}

users := make(map[int]User)

users[5] = User{"Steve"}

为什么现在无法进入图表中的结构论坛?

ZZU1

任何人都能给我们一点光线,让我们去存取地图,或是在逻辑后面,为什么不可能?

我知道你可以做到这一点,做一份结构的拷贝,改变拷贝,复制到地图上——但这是一个成本效益高的拷贝操作。

我也知道这可以通过我的地图上的结构指针来实现,但我不想这样做。


最根本的问题是,你不能把地图上某个东西的地址记下来。您可能认为编译程序会将users[5].name ="Mark"重新安排到这个目录中。

1
(&users[5]).name ="Mark"

但它不能编译,给出了这个错误

1
cannot take the address of users[5]

这是为了让地图能够自由地随意重新排序,从而有效地使用内存。

唯一改变地图中实际内容的方法是分配给它,即

1
2
3
t := users[5]
t.name ="Mark"
users[5] = t

所以我认为你要么活在上面的副本中,要么活在地图中存储指针中。存储指针的缺点是使用更多的内存和更多的内存分配,这可能比上面的复制更重要——只有您和您的应用程序才能知道这一点。

第三种选择是使用切片-如果将users := make(map[int]User)更改为users := make([]User, 10),则原始语法将完美工作。


我认为这些是为了简化映射实现而引入的限制。

例如,它们不允许访问映射查找返回的值的地址。

1
 fmt.Printf("Address of p[key] %p", &p["key"])

/map1.go:19:36:不能取p的地址["key"]

同样,当我们引用映射时,返回的值是"返回值",如果我借用函数参数中使用的术语,编辑返回的结构不会对映射的内容产生任何影响。