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

我们是否应该在Golang中为列表使用结构指针?,go,Go,我有一个关于struct数组的问题,我们是否应该使用struct指针 假设我们有一个包含项目数组的项目和购物车 type Item struct { Id string Name string Price string } type Cart1 struct { Id string Items []Item } 或 我听说当我们将一个结构附加到一个结构列表时,golang会复制一

我有一个关于struct数组的问题,我们是否应该使用struct指针

假设我们有一个包含项目数组的项目和购物车

type Item struct {
    Id          string
    Name        string
    Price       string
}

type Cart1 struct {
    Id          string
    Items       []Item
}

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


有人能澄清一下吗?

Go数组是按值传递的,Go切片像指针一样按引用传递。事实上,片包含一个指针作为其内部数据类型的一部分。由于您的购物车将有不同数量的物品,只需使用
[]物品


顺便说一句,如果该片的容量为4,并且您在其上附加了第5项内容,则Go将使容量加倍,因此并非每次添加都会分配内存。

Go数组按值传递,Go片像指针一样按引用传递。事实上,片包含一个指针作为其内部数据类型的一部分。由于您的购物车将有不同数量的物品,只需使用
[]物品


顺便说一句,如果该片的容量为4,而您在其上附加了第5项内容,则Go会将容量加倍,因此并非每次添加都会分配内存

您的假设是正确的-任何(不仅仅是append())函数应用程序都会按Go中提供的参数值进行复制。但指针片如何减少内存消耗呢?您应该将实际结构加上对它的引用存储在内存中。引用更多的是关于访问控制

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"

您的假设是正确的——Go中的任何(不仅仅是append())函数应用程序按值复制提供的参数。但指针片如何减少内存消耗呢?您应该将实际结构加上对它的引用存储在内存中。引用更多的是关于访问控制

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"

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

Go中的所有内容都是按值传递的。如果您有一个结构切片,并附加一个新结构,Go将创建一个副本。根据结构的大小,它可能太大。相反,您可以选择使用指向结构的指针片段。这样,当您附加Go时,将创建指针的副本

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


你选择哪一个完全取决于你自己。这里没有单一的“走的路”。

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

Go中的所有内容都是按值传递的。如果您有一个结构切片,并附加一个新结构,Go将创建一个副本。根据结构的大小,它可能太大。相反,您可以选择使用指向结构的指针片段。这样,当您附加Go时,将创建指针的副本

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


你选择哪一个完全取决于你自己。这里没有单一的“Go way”。

问题询问数组/切片的元素类型,而不是使用数组还是切片。@icza似乎这个答案是为了解决一个XY问题-OP说“项目数组或指针数组”,含蓄地说“Go中惯用的解决方案是什么”,根据有效的Go,这两者都不是,而是
切片
。如果人们只回答字面上的OP问题,那么肯定没什么帮助。问题是关于数组/切片的元素类型,而不是数组或切片是否要使用。@icza似乎这个答案是在试图解决XY问题-OP说“项目数组或指针数组”,含蓄地说“Go中的惯用解决方案是什么?”而且,根据有效go,两者都不是,而是
slice
。如果人们只回答字面上的OP问题,那么肯定没什么帮助