为了账号安全,请及时绑定邮箱和手机立即绑定

访问映射值中的结构字段(不复制)

访问映射值中的结构字段(不复制)

Go
忽然笑 2021-06-18 19:33:27
假设以下type User struct {    name string}users := make(map[int]User)users[5] = User{"Steve"}为什么不能访问现在存储在地图中的结构体实例?users[5].name = "Mark"任何人都可以阐明如何访问地图存储的结构,或者为什么不可能的背后的逻辑?笔记我知道您可以通过制作结构的副本、更改副本并复制回地图来实现这一点——但这是一个代价高昂的复制操作。我也知道这可以通过在我的地图中存储结构指针来完成,但我也不想这样做。
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

根本问题是您无法获取地图中项目的地址。你可能认为编译器会重新安排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)


查看完整回答
反对 回复 2021-06-21
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

  1. 映射通常是稀疏填充的哈希表,当它们超过阈值时会重新分配。当有人持有指向值的指针时,重新分配会产生问题

  2. 如果您不想创建对象的副本,则可以将指向对象本身的指针存储为值

  3. 当我们引用地图时,返回的值是“按值返回”,如果我可以借用函数参数中使用的术语,编辑返回的结构对地图的内容没有任何影响


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信