Pointers 带指针映射的Golang-空间效率

Pointers 带指针映射的Golang-空间效率,pointers,dictionary,memory,go,space-complexity,Pointers,Dictionary,Memory,Go,Space Complexity,我只对指针略知一二,但它们似乎是一种重用内存、避免对对象进行额外复制的好方法 假设我有一个struct type MyObject struct { field1 int field2 string field3 []string // some long list of long strings } 我希望有两个映射,通过它们的字段值可以有效地查找相应的对象 myField1Map := make(map[int]*MyObject) myField2Map := make(ma

我只对指针略知一二,但它们似乎是一种重用内存、避免对对象进行额外复制的好方法

假设我有一个
struct

type MyObject struct {
  field1 int
  field2 string
  field3 []string // some long list of long strings
}
我希望有两个
映射
,通过它们的字段值可以有效地查找相应的对象

myField1Map := make(map[int]*MyObject)
myField2Map := make(map[string]*MyObject)

假设我选择前者

myObj1 := new(MyObject)
myObj1.field1 = 1
myObj1.field2 = "Mufasaaaaa"
myObj1.field3 = []string{// lots and lots of long strings}

myField1Map[myObj1.field1] = myObj1
myField2Map[myObj1.field2] = myObj1
我在空间效率方面的权衡是什么?在我看来,我之所以节省空间,是因为两个贴图都引用了内存中的同一个对象

一件很酷的事是,我在一家玩具店设置了一个玩具问题。我可以在一个地图中更改一个值的字段,它将显示在另一个地图中。假设其中一个映射是指向对象的指针值的主键,那么这似乎是一个不错的奖励


有人能澄清一下这是否是思考指针和空间的正确方式吗。还有,这是一种普遍的做法吗?我在围棋时作弊吗

我不能说这是否是一种常见的做法,但这根本不是作弊。 考虑到结构是在GO中复制的,因此在复制整个结构时可能会有很大的空间丢失。

但是,请注意,切片隐式地指向底层数组。因此,如果您的结构具有
field3
的切片类型,那么最终只会复制几个值,而实际的保存量不会太大——在本例中


然而,我更喜欢带指针的解决方案。从概念上讲,如果一个值被两个不同的位置访问,那么指向该值会更简单,并且在修改一个字段的情况下,也不必更新相应的另一个字段。(对不起,我没读到你是自己弄明白的:)

谢谢!我需要一些澄清。您关于指向从多个位置访问的值的论点很有道理。
myObj1 := new(MyObject)
myObj1.field1 = 1
myObj1.field2 = "Mufasaaaaa"
myObj1.field3 = []string{// lots and lots of long strings}

myField1Map[myObj1.field1] = myObj1
myField2Map[myObj1.field2] = myObj1