我有以下代码将一个新元素添加到一个切片(如果它不存在)。如果它确实存在,那么 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]
}
}
- 3 回答
- 0 关注
- 179 浏览
添加回答
举报
0/150
提交
取消