面试题答案
一键面试接口在Go语言中实现模块解耦的原理
- 抽象行为:Go语言的接口定义了一组方法的签名,而不关心这些方法的具体实现。通过这种方式,一个模块可以只依赖于接口所定义的行为,而不是具体的实现类型。这样,当实现类型发生变化时,依赖接口的模块无需修改代码,实现了模块间的解耦。
- 依赖倒置:高层模块不应该依赖底层模块,两者都应该依赖抽象(接口)。这使得模块之间的依赖关系更加灵活,降低了耦合度。
简单场景举例及代码
假设我们有一个电商系统,其中有一个订单处理模块和不同的支付模块(如支付宝支付、微信支付)。订单处理模块不应该关心具体的支付实现,而是依赖一个支付接口。
package main
import "fmt"
// 支付接口
type Payment interface {
Pay(amount float64) string
}
// 支付宝支付实现
type Alipay struct{}
func (a Alipay) Pay(amount float64) string {
return fmt.Sprintf("支付宝支付%.2f元成功", amount)
}
// 微信支付实现
type WechatPay struct{}
func (w WechatPay) Pay(amount float64) string {
return fmt.Sprintf("微信支付%.2f元成功", amount)
}
// 订单处理模块
type Order struct {
amount float64
pay Payment
}
func (o Order) Process() string {
return o.pay.Pay(o.amount)
}
func main() {
// 使用支付宝支付
order1 := Order{amount: 100.0, pay: Alipay{}}
fmt.Println(order1.Process())
// 使用微信支付
order2 := Order{amount: 200.0, pay: WechatPay{}}
fmt.Println(order2.Process())
}
在上述代码中:
Payment
接口定义了Pay
方法,这是支付行为的抽象。Alipay
和WechatPay
结构体分别实现了Payment
接口的Pay
方法,这是具体的支付实现。Order
结构体中的pay
字段类型为Payment
接口,使得订单处理模块只依赖于支付接口,而不依赖具体的支付实现。这样,当需要新增支付方式时,只需要实现Payment
接口,订单处理模块无需修改,实现了模块间的解耦。