答案:通过定义用户、商品和购物项结构体,使用map管理购物车条目,实现添加、删除、计算总价功能,并结合http接口与读写锁支持并发操作,适合扩展优惠券与库存校验。

在golang中实现购物车功能,关键在于管理用户、商品和购物项之间的关系。通常使用结构体来表示数据模型,结合内存存储或数据库完成增删改查操作。下面是一个简洁实用的实现思路。
定义数据模型
购物车的核心是用户、商品和购物项。先定义对应的结构体:
type Product struct { ID int Name string Price float64 } <p>type CartItem struct { ProductID int Quantity int }</p><p>type Cart struct { UserID int Items map[int]*CartItem // key: ProductID }</p>
每个购物车属于一个用户,包含多个商品条目,用map方便通过商品ID快速查找和更新。
实现购物车基本操作
常见的操作包括添加商品、更新数量、删除商品和计算总价。
立即学习“go语言免费学习笔记(深入)”;
添加商品到购物车:
- 如果商品已存在,增加数量
- 如果不存在,创建新条目
func (c *Cart) AddProduct(productID int, quantity int) { if item, exists := c.Items[productID]; exists { item.Quantity += quantity } else { c.Items[productID] = &CartItem{ProductID: productID, Quantity: quantity} } }
删除商品:
func (c *Cart) RemoveProduct(productID int) { delete(c.Items, productID) }
计算总价:
func (c *Cart) Total(products map[int]Product) float64 { var total float64 for _, item := range c.Items { if p, ok := products[item.ProductID]; ok { total += p.Price * float64(item.Quantity) } } return total }
集成HTTP接口示例
使用net/http实现简单API:
var carts = make(map[int]*Cart) // 模拟存储,key: UserID var products = map[int]Product{ 1: {ID: 1, Name: "iphone", Price: 6999.0}, 2: {ID: 2, Name: "airpods", Price: 1299.0}, } <p>func addToCart(w http.ResponseWriter, r *http.Request) { userID := 1 // 实际应从session或token获取 productID := 1 quantity := 2</p><pre class='brush:php;toolbar:false;'>cart, exists := carts[userID] if !exists { cart = &Cart{UserID: userID, Items: make(map[int]*CartItem)} carts[userID] = cart } cart.AddProduct(productID, quantity) w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Added product %d to cart", productID)
}
持久化与并发考虑
当前实现基于内存,重启后数据丢失。生产环境建议:
例如用读写锁保护购物车操作:
var cartMutex sync.RWMutex <p>func getCart(userID int) *Cart { cartMutex.RLock() defer cartMutex.RUnlock() return carts[userID] }</p>
基本上就这些。核心是结构清晰、操作安全、易于扩展。根据业务需求逐步加入优惠券、库存校验等功能即可。


