亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們應該更喜歡在 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 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號