gpt4 book ai didi

pointers - Golang - 带指针的 map 的空间效率

转载 作者:IT王子 更新时间:2023-10-29 02:04:25 25 4
gpt4 key购买 nike

我对指针只有最低限度的了解,但它们似乎是重用内存并避免创建额外对象副本的好方法。

假设我有一个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)

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 Playground 中设置了一个玩具问题.我可以在我的一张 map 中更改值的字段,它会显示在另一张 map 中。如果假设这些映射之一是对象指针值的主键,这似乎是一个不错的奖励。

有人可以阐明这是否是思考指针和空间的正确方法。另外,这是一种常见的做法吗?我在 Go 作弊吗?

最佳答案

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

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

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

关于pointers - Golang - 带指针的 map 的空间效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com