MST

星途 面试题库

面试题:Go语言结构体嵌套与组合在复杂业务场景中的设计与优化

在一个电商系统中,有商品(`Product`)结构体,包含基本信息如 `id`、`name`、`price` 等。有订单(`Order`)结构体,订单由多个商品组成,同时订单还有 `orderId`、`customer` 等信息。现在要设计一个功能,计算订单的总金额,并能方便地扩展订单的折扣计算逻辑(如满减、百分比折扣等)。请使用结构体的嵌套与组合,设计出合理的结构体和方法,用Go语言编写代码实现上述功能,并说明这种设计在扩展性和维护性方面的优势。
41.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

// Product结构体表示商品
type Product struct {
    id    int
    name  string
    price float64
}

// OrderItem结构体表示订单中的商品项
type OrderItem struct {
    product Product
    quantity int
}

// Order结构体表示订单
type Order struct {
    orderId  int
    customer string
    items    []OrderItem
    discountCalculator DiscountCalculator
}

// DiscountCalculator接口用于计算折扣
type DiscountCalculator interface {
    CalculateDiscount(order Totalizable) float64
}

// Totalizable接口用于获取订单总价
type Totalizable interface {
    Total() float64
}

// Order实现Totalizable接口
func (o Order) Total() float64 {
    total := 0.0
    for _, item := range o.items {
        total += item.product.price * float64(item.quantity)
    }
    return total
}

// CalculateTotal方法计算订单总金额
func (o Order) CalculateTotal() float64 {
    total := o.Total()
    if o.discountCalculator != nil {
        discount := o.discountCalculator.CalculateDiscount(o)
        total -= discount
    }
    return total
}

// FixedDiscountCalculator结构体用于固定金额满减折扣
type FixedDiscountCalculator struct {
    threshold float64
    discount  float64
}

// CalculateDiscount方法计算固定金额满减折扣
func (f FixedDiscountCalculator) CalculateDiscount(order Totalizable) float64 {
    total := order.Total()
    if total >= f.threshold {
        return f.discount
    }
    return 0
}

// PercentageDiscountCalculator结构体用于百分比折扣
type PercentageDiscountCalculator struct {
    percentage float64
}

// CalculateDiscount方法计算百分比折扣
func (p PercentageDiscountCalculator) CalculateDiscount(order Totalizable) float64 {
    total := order.Total()
    return total * p.percentage
}

扩展性优势

  1. 接口抽象:通过 DiscountCalculator 接口,将折扣计算逻辑抽象出来。如果需要添加新的折扣类型(如阶梯折扣、限时折扣等),只需创建一个新的结构体实现 DiscountCalculator 接口即可,无需修改原有的订单计算逻辑。
  2. 组合方式Order 结构体中组合了 DiscountCalculator 接口类型的字段,这样可以在运行时动态地设置不同的折扣计算方式,提高了灵活性。

维护性优势

  1. 单一职责原则:每个结构体和接口都有明确的职责。例如,Product 结构体负责商品信息,Order 结构体负责订单信息和总金额计算,折扣计算逻辑由实现 DiscountCalculator 接口的结构体负责。这样在修改或扩展某一部分功能时,不会影响到其他部分。
  2. 代码可读性:结构清晰,各个部分的功能一目了然。例如,CalculateTotal 方法的逻辑简单明了,先计算总价,再根据折扣计算器计算折扣并扣除,易于理解和维护。