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
任何人都能给我们一点光线,让我们去存取地图,或是在逻辑后面,为什么不可能?
注
我知道你可以做到这一点,做一份结构的拷贝,改变拷贝,复制到地图上——但这是一个成本效益高的拷贝操作。
我也知道这可以通过我的地图上的结构指针来实现,但我不想这样做。
最根本的问题是,你不能把地图上某个东西的地址记下来。您可能认为编译程序会将
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 |
所以我认为你要么活在上面的副本中,要么活在地图中存储指针中。存储指针的缺点是使用更多的内存和更多的内存分配,这可能比上面的复制更重要——只有您和您的应用程序才能知道这一点。
第三种选择是使用切片-如果将
我认为这些是为了简化映射实现而引入的限制。
例如,它们不允许访问映射查找返回的值的地址。
1 | fmt.Printf("Address of p[key] %p", &p["key"]) |
。
/map1.go:19:36:不能取p的地址["key"]
同样,当我们引用映射时,返回的值是"返回值",如果我借用函数参数中使用的术语,编辑返回的结构不会对映射的内容产生任何影响。