我有一個關于結構數組的問題,我們是否應該更喜歡使用結構指針。假設我們有 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 關注
- 189 瀏覽
添加回答
舉報
0/150
提交
取消