我有两个阵列:购物车和促销活动,我需要找出可以应用于购物车的促销活动。
促销活动包括受影响者和受影响者,所以我所做的是在我的购物车数组中搜索我是否有任何受影响者,如果我这样做,那么我会搜索任何受影响的人,然后申请促销活动。然而,这迫使我实现三个嵌套循环,这对于具有3秒超时的API来说并不理想。
我想知道golang的阵列是否有某种东西,或者是否有一种方法可以让它更快
这是我的代码:
OUTER:
for i, item := range cartSession.Cart {
for _, promo := range promotions {
if item.Name == promo.Affected.Name {
// If an item in the cart can be affected by the promo
// then start investigating if we have the affectee
if item.Name == promo.Affectee.Name {
// If the item is the affected and affectee
if promo.Affected.CostPtg != 0 {
cartSession.Cart[i].Cost *= promo.Affected.CostPtg
} else {
cartSession.Cart[i].Cost = promo.Affected.CostFixed
}
continue OUTER
} else {
for _, subItem := range cartSession.Cart {
if subItem.Name == promo.Affectee.Name {
// We have both the affected & affectee
// time to apply the promo affect
if promo.Affected.CostPtg != 0 {
cartSession.Cart[i].Cost *= promo.Affected.CostPtg
} else {
cartSession.Cart[i].Cost = promo.Affected.CostFixed
}
continue OUTER
}
}
}
}
}
}
答案 0 :(得分:1)
您可以通过一种方式加快速度,即使用地图在购物车中查找项目,而不是迭代它们。像这样创建地图:
cartMap := make(map[string]*CartType, len(cartSession.Cart))
for i := range cartSession.Cart {
cartMap[cartSession.Cart[i].Name] = cartSession.Cart[i]
}
然后在构建地图后,您可以在购物车中查看它是否包含受影响和受影响的人,如下所示:
for i := range promotions {
// See if affected item is in cart
affected := promotions[i].Affected
cartItem, ok := cartMap[affected.Name]
if !ok {
// Did not find affected
continue
}
// See if affectee is in cart
affectee := promotions[i].Affectee
if _, ok = cartMap[affectee.Name]; !ok {
// Did not find affectee
continue
}
// Apply promotion
if affected.CostPtg != 0 {
cartItem.Cost *= affected.CostPtg
} else {
cartItem.Cost = affected.CostFixed
}
}