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

我有一个关于结构数组的问题,我们是否应该更喜欢使用结构指针。


假设我们有 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会复制并将其添加到列表中,这不是必需的,所以我们应该使用结构指针列表,是这样吗?


谁能澄清一下?


收到一只叮咚
浏览 242回答 3
3回答

慕妹3146593

您的假设是正确的 - 任何(不仅是 append())函数应用程序在 Go 中按值提供的参数复制。但是指针切片如何减少内存消耗呢?您应该将实际的结构加上对它的引用存储在内存中。引用更多的是关于访问控制。foo := cart1.Items[0]foo.Name := "foo" //will not change cart1//but in pointer casebar := cart2.Items[0]bar.Name := "bar" //will change cart2.Items[0].Name to "bar"

皈依舞

Go 数组是按值传递的,go Slice 是像指针一样通过引用传递的。事实上,切片包括一个指针作为其内部数据类型的一部分。由于您的购物车中的商品数量不定,因此只需使用[]Item.看到这个有效的去参考顺便说一句,如果切片的容量为 4 并且您在其上附加了第 5 项内容,Go 会将容量加倍,因此并不是每次添加都会分配内存

慕村9548890

据我了解您的问题,您的问题不是内存消耗,而是不必要的结构复制。Go 中的所有内容都是按值传递的。如果你有一个结构切片并附加一个新结构,Go 将制作一个副本。根据结构的大小,它可能太多了。相反,您可以选择使用指向结构的指针切片。这样,当你追加 Go 时,就会复制一个指针。这可能更便宜,但也可能使访问切片的代码复杂化。因为现在您已经共享了可变状态,这是一个问题,尤其是在 Go 中,您不能拥有 const 指针并且任何人都可以修改结构。指针也容易出现 nil 取消引用错误。你选择哪一个完全取决于你。这里没有单一的“Go way”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go