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

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

奇怪的行為 - 變量沒有正確遞增

奇怪的行為 - 變量沒有正確遞增

Go
冉冉說 2021-06-10 17:05:08
我有以下代碼將一個新元素添加到一個切片(如果它不存在)。如果它確實存在,那么 qty 屬性應該增加現有元素而不是添加新元素:package mainimport (    "fmt")type BoxItem struct {    Id int    Qty int}type Box struct {    BoxItems []BoxItem}func (box *Box) AddBoxItem(boxItem BoxItem) BoxItem {    // If the item exists already then increment its qty    for _, item := range box.BoxItems {        if item.Id == boxItem.Id {             item.Qty++             return item        }    }    // New item so append    box.BoxItems = append(box.BoxItems, boxItem)    return boxItem}func main() {    boxItems := []BoxItem{}    box := Box{boxItems}    boxItem := BoxItem{Id: 1, Qty: 1}    // Add this item 3 times its qty should be increased to 3 afterwards    box.AddBoxItem(boxItem)    box.AddBoxItem(boxItem)    box.AddBoxItem(boxItem)    fmt.Println(len(box.BoxItems))  // Prints 1 which is correct    for _, item := range box.BoxItems {        fmt.Println(item.Qty)  // Prints 1 when it should print 3    }}問題是數量永遠不會正確增加。當它在提供的示例中應該是 3 時,它總是以 1 結尾。我已經調試了代碼,看起來確實達到了增量部分,但該值并未保留到項目中。這里有什么問題?
查看完整描述

3 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

您正在增加Qty的副本,box.BoxItems因為range將產生切片中元素的副本。請參閱此示例。


所以,在for _, item := range box.BoxItems,item是在box.BoxItems元素的副本。


將您的循環更改為


for i := 0; i < len(box.BoxItems); i++ {

    if box.boxItems[i].Id == boxItem.Id {

         box.boxItems[i].Qty++

         return box.BoxItems[i]

    }

}


查看完整回答
反對 回復 2021-06-21
  • 3 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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