一尘不染

访问映射值内的结构字段(无复制)

go

假设以下

type User struct {
    name string
}

users := make(map[int]User)

users[5] = User{"Steve"}

为什么无法访问现在存储在映射中的struct实例?

users[5].name = "Mark"

任何人都可以阐明如何访问映射存储的结构,或为何无法访问它的逻辑?

笔记

我知道您可以通过复制结构,更改副本并将其复制回到地图中来实现这一点-但这是一项昂贵的复制操作。

我也知道这可以通过在我的地图中存储结构指针来完成,但是我也不想这样做。


阅读 244

收藏
2020-07-02

共1个答案

一尘不染

根本问题是您无法获取地图中某物的地址。您可能会认为编译会重新安排users[5].name = "Mark"

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

但这不能编译,给出此错误

cannot take the address of users[5]

这是为了让地图可以自由地随意重新排序,以有效地使用内存。

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

t := users[5]
t.name = "Mark"
users[5] = t

因此,我认为您要么必须使用上述副本,要么必须将指针存储在地图中。存储指针的缺点是使用更多的内存和更多的内存分配,这可能超过上面的复制操作-
只有您和您的应用程序才能知道这一点。

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

2020-07-02