可以对商品的不同活动(如满减、限时价和折扣)进行分组,并在购物车中显示各个活动标签下的最优价格组合。以下代码将商品按活动类别进行分组计算,并输出在购物车中的显示信息。
package mainimport ("fmt""math"
)type Discount struct {Name string // 商品名称OriginalPrice float64 // 原价FullReduction float64 // 满减金额LimitedPrice float64 // 限时优惠价DiscountRate float64 // 折扣比例 (如0.8代表8折)
}// ActivityGroup 存储商品按最优活动标签分组
type ActivityGroup struct {Tag string // 活动标签Items []Discount // 商品列表Total float64 // 总价格
}// calculateBestActivityTag 计算商品最优惠的活动标签和价格
func calculateBestActivityTag(item Discount) (string, float64) {// 计算每种活动优惠后的价格fullReductionPrice := item.OriginalPrice - item.FullReductionif fullReductionPrice < 0 {fullReductionPrice = 0}discountPrice := item.OriginalPrice * item.DiscountRatelimitedPrice := item.LimitedPrice// 选择最小的价格和对应活动标签bestPrice := math.Min(math.Min(fullReductionPrice, discountPrice), limitedPrice)var bestTag stringswitch bestPrice {case fullReductionPrice:bestTag = "满减活动"case discountPrice:bestTag = "折扣活动"case limitedPrice:bestTag = "限时价活动"}return bestTag, bestPrice
}// groupItemsByBestActivity 根据最优活动将商品分组
func groupItemsByBestActivity(items []Discount) []ActivityGroup {activityMap := make(map[string]*ActivityGroup)for _, item := range items {bestTag, bestPrice := calculateBestActivityTag(item)if activityMap[bestTag] == nil {activityMap[bestTag] = &ActivityGroup{Tag: bestTag, Items: []Discount{}}}activityMap[bestTag].Items = append(activityMap[bestTag].Items, item)activityMap[bestTag].Total += bestPrice}// 将结果转为 slice 以便输出var groupedActivities []ActivityGroupfor _, activity := range activityMap {groupedActivities = append(groupedActivities, *activity)}return groupedActivities
}func main() {// 示例商品数据items := []Discount{{Name: "商品A", OriginalPrice: 100, FullReduction: 10, LimitedPrice: 90, DiscountRate: 0.9},{Name: "商品B", OriginalPrice: 150, FullReduction: 20, LimitedPrice: 130, DiscountRate: 0.85},{Name: "商品C", OriginalPrice: 200, FullReduction: 25, LimitedPrice: 180, DiscountRate: 0.8},{Name: "商品D", OriginalPrice: 120, FullReduction: 5, LimitedPrice: 110, DiscountRate: 0.95},}// 根据最优活动分组商品groupedActivities := groupItemsByBestActivity(items)// 输出结果for _, group := range groupedActivities {fmt.Printf("活动标签: %s\n", group.Tag)for _, item := range group.Items {fmt.Printf(" 商品: %s, 原价: %.2f\n", item.Name, item.OriginalPrice)}fmt.Printf(" 该活动下商品总价: %.2f\n\n", group.Total)}
}
calculateBestActivityTag
函数:接收商品的所有优惠信息,计算每个优惠方式的价格,并返回最低价格对应的活动标签及该价格。groupItemsByBestActivity
函数:通过调用calculateBestActivityTag
函数,将商品按最优活动标签分组,并累加每个活动下的商品总价。main
函数:定义商品数据并调用函数计算分组结果。
示例输出
运行此代码将按最优活动标签输出分组的商品和每个活动下的总优惠价,例如:
活动标签: 满减活动商品: 商品A, 原价: 100.00商品: 商品C, 原价: 200.00该活动下商品总价: 265.00活动标签: 折扣活动商品: 商品B, 原价: 150.00该活动下商品总价: 127.50活动标签: 限时价活动商品: 商品D, 原价: 120.00该活动下商品总价: 110.00
总结
此方法能够动态计算商品最优惠的活动标签,将其分组显示在购物车中,方便查看各个活动下的总价。