我有一个关于结构数组的问题,我们是否应该更喜欢使用结构指针。假设我们有 Item 和 Cart,其中包含一个 Items 数组。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 回答
慕妹3146593
TA贡献1820条经验 获得超9个赞
您的假设是正确的 - 任何(不仅是 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"
慕村9548890
TA贡献1884条经验 获得超4个赞
据我了解您的问题,您的问题不是内存消耗,而是不必要的结构复制。
Go 中的所有内容都是按值传递的。如果你有一个结构切片并附加一个新结构,Go 将制作一个副本。根据结构的大小,它可能太多了。相反,您可以选择使用指向结构的指针切片。这样,当你追加 Go 时,就会复制一个指针。
这可能更便宜,但也可能使访问切片的代码复杂化。因为现在您已经共享了可变状态,这是一个问题,尤其是在 Go 中,您不能拥有 const 指针并且任何人都可以修改结构。指针也容易出现 nil 取消引用错误。
你选择哪一个完全取决于你。这里没有单一的“Go way”。
- 3 回答
- 0 关注
- 241 浏览
添加回答
举报
0/150
提交
取消
