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

Golang - 带指针的地图的空间效率

Golang - 带指针的地图的空间效率

Go
MM们 2022-01-10 14:20:16
我对指针只有最低限度的熟悉,但它们似乎是重用内存并避免制作额外对象副本的好方法。假设我有一个 structtype MyObject struct {  field1 int  field2 string  field3 []string // some long list of long strings}我想要两个maps允许通过字段值有效查找相应对象的方法myField1Map := make(map[int]*MyObject)myField2Map := make(map[string]*MyObject)或者myField1Map := make(map[int]MyObject)myField2Map := make(map[string]MyObject)假设我选择前者myObj1 := new(MyObject)myObj1.field1 = 1myObj1.field2 = "Mufasaaaaa"myObj1.field3 = []string{// lots and lots of long strings}myField1Map[myObj1.field1] = myObj1myField2Map[myObj1.field2] = myObj1我在空间效率方面的权衡是什么?在我看来,我正在节省空间,因为两个映射都引用了内存中的同一个对象。一件很酷的事情是,我在Go Playground 中设置了一个玩具问题。我可以在我的一个地图中更改一个值的字段,它会显示在另一个地图中。如果假设这些映射之一是指向对象的指针值的主键,这似乎是一个不错的奖励。有人可以澄清这是否是思考指针和空间的正确方法。另外,这是一种常见的做法吗?我在作弊Go吗?
查看完整描述

1 回答

?
收到一只叮咚

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

我不能说这是否是一种普遍的做法,但它根本不是作弊。考虑到结构是在 go 中复制的,因此在复制整个结构时可能会损失大量空间。

但是请注意,切片隐式指向底层数组。因此,如果您的结构的切片类型为field3,您最终只会复制几个值,而实际节省的空间不会那么多 - 在这种情况下。

不过,我更喜欢带指针的解决方案。如果一个值被两个不同的位置访问,则在概念上指向一个值更简单,并且在您修改一个字段的情况下,您也不必更新相应的另一个字段。(编辑对不起,我没有读到你自己想出来的:))


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

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