为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
收到一只叮咚 2022-01-10 17:33:38
我有一个关于结构数组的问题,我们是否应该更喜欢使用结构指针。假设我们有 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"


查看完整回答
反对 回复 2022-01-10
?
皈依舞

TA贡献1851条经验 获得超3个赞

Go 数组是按值传递的,go Slice 是像指针一样通过引用传递的。事实上,切片包括一个指针作为其内部数据类型的一部分。由于您的购物车中的商品数量不定,因此只需使用[]Item.

看到这个有效的去参考

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


查看完整回答
反对 回复 2022-01-10
?
慕村9548890

TA贡献1884条经验 获得超4个赞

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

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

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

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


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号