我们是否应该更喜欢在Golang中使用结构指针作为列表?

时间:2016-05-20 13:03:40

标签: go

我有一个关于struct数组的问题,如果我们更喜欢使用struct指针。

我们说我们有一个物品和购物车,其中包含一系列物品。

type Item struct {
    Id          string
    Name        string
    Price       string
}

type Cart1 struct {
    Id          string
    Items       []Item
}

type Cart2 struct {
    Id          string
    Items       []*Item
}

我听说当我们将结构附加到结构列表时,golang会复制并将其添加到列表中,这不是必需的,所以我们应该使用结构指针列表,这是真的吗?

任何人都可以澄清吗?

3 个答案:

答案 0 :(得分:3)

你的假设是正确的 - 任何(不仅是append())函数应用程序副本通过Go中的值提供参数。但指针如何减少内存消耗?您应该在内存中存储实际的struct加引用。引用更多是关于访问控制。

foo := cart1.Items[0]
foo.Name := "foo" //will not change cart1
//but in pointer case
bar := cart2.Items[0]
bar.Name := "bar" //will change cart2.Items[0].Name to "bar"

答案 1 :(得分:1)

Go Arrays按值传递,go切片通过引用传递,如指针。实际上,切片包含指针作为其内部数据类型的一部分。由于您的购物车具有可变数量的商品,因此只需使用[]Item

请参阅this effective go reference

顺便说一句,如果切片有容量4并且你附加了第五件东西,​​那么Go的容量加倍,所以它不像每一个添加都会分配内存

答案 2 :(得分:0)

据我了解你的问题,你的问题不是内存消耗,而是不必要的结构复制。

Go中的所有内容都按值传递。如果你有一块结构,你附加一个新结构Go将进行复制。根据结构的大小,它可能太多了。相反,您可以选择使用一段指向结构的指针。这样当你追加Go时会复制一个指针。

这可能会更便宜,但它也可能使访问切片的代码复杂化。因为现在你有共享可变状态这是一个问题,特别是在Go中你不能有一个const指针,任何人都可以修改结构。指针也容易出现零引用错误。

您选择哪一个完全取决于您。没有单身" Go way"这里。