MST

星途 面试题库

面试题:Go语言中接口优点在代码解耦方面的实际体现

请举例说明在Go语言中,接口如何实现代码的解耦。例如,假设有一个电商系统,包含订单处理和支付模块,你如何通过接口设计来解耦这两个模块,使得支付方式的变更不会影响订单处理逻辑,详细描述实现思路和代码示例。
31.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义支付接口:包含支付相关的方法,如支付操作。
  2. 订单处理模块依赖支付接口:订单处理逻辑通过该接口调用支付功能,而不依赖具体的支付实现。
  3. 实现具体支付方式:每种支付方式都实现支付接口,这样当支付方式变更时,只需修改或新增具体支付实现,订单处理逻辑不受影响。

代码示例

package main

import (
    "fmt"
)

// 支付接口
type Payment interface {
    Pay(amount float64) bool
}

// 支付宝支付实现
type Alipay struct{}

func (a Alipay) Pay(amount float64) bool {
    fmt.Printf("使用支付宝支付 %.2f 元\n", amount)
    return true
}

// 微信支付实现
type WechatPay struct{}

func (w WechatPay) Pay(amount float64) bool {
    fmt.Printf("使用微信支付 %.2f 元\n", amount)
    return true
}

// 订单处理模块
type Order struct {
    payment Payment
    amount  float64
}

func NewOrder(payment Payment, amount float64) *Order {
    return &Order{
        payment: payment,
        amount:  amount,
    }
}

func (o *Order) Process() {
    if o.payment.Pay(o.amount) {
        fmt.Println("订单支付成功")
    } else {
        fmt.Println("订单支付失败")
    }
}

可以这样调用:

func main() {
    // 使用支付宝支付订单
    alipayOrder := NewOrder(Alipay{}, 100.0)
    alipayOrder.Process()

    // 使用微信支付订单
    wechatPayOrder := NewOrder(WechatPay{}, 200.0)
    wechatPayOrder.Process()
}

在上述代码中,Order 结构体只依赖 Payment 接口,而不是具体的支付实现。当需要新增或变更支付方式时,如添加银行卡支付,只需实现 Payment 接口,而 OrderProcess 方法无需修改,从而实现了订单处理和支付模块的解耦。