奇怪的行为 - 变量没有正确递增

我有以下代码将一个新元素添加到一个切片(如果它不存在)。如果它确实存在,那么 qty 属性应该增加现有元素而不是添加新元素:


package main


import (

    "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 结尾。


我已经调试了代码,看起来确实达到了增量部分,但该值并未保留到项目中。


这里有什么问题?


冉冉说
浏览 180回答 3
3回答

开满天机

您正在增加Qty的副本,box.BoxItems因为range将产生切片中元素的副本。请参阅此示例。所以,在for _, item := range box.BoxItems,item是在box.BoxItems元素的副本。将您的循环更改为for i := 0; i < len(box.BoxItems); i++ {&nbsp; &nbsp; if box.boxItems[i].Id == boxItem.Id {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;box.boxItems[i].Qty++&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return box.BoxItems[i]&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go