为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信