golang 代码扩展

本文通过示例展示了如何在Go中编写可扩展的代码,以处理用户购买产品的业务逻辑。通过定义规则结构体,使用映射存储规则处理器,并注册新的规则函数,实现了在不修改原有代码的情况下增加新功能。在测试中,添加了两个规则:检查购买时间是否有效和订单金额是否达到指定数值。
摘要由CSDN通过智能技术生成
 
 
在写业务逻辑的时候如何写可扩展的代码?
之后加功能怎么不影响原来的代码?

-------------------以下是具体的应用------------------------------

//用户需要符合某些规则才能购买产品
//1.在某个时间段,2.产品订单金额大于一个数
//实现代码如下
//定义结构体(规则相关的参数)
type Rule struct {
	Key string
	TimeStart string
	TimeEnd string
	OrderAmount int
}

//map关系
var muxRule map[string]func(rule *Rule) error

//定义register,有新的规则则需要调用一下这个函数进行注册
func registerBuy(key string, f func(rule *Rule) error) {
	if muxRule == nil {
		muxRule = make(map[string]func(rule *Rule) error)
	}
	if _, exist := muxRule[key]; exist {
		fmt.Println("handler exist")
	}
	muxRule[key] = f
}

//factory,调用实际方法,返回结果
func factoryBuy(rule *Rule) error {
	return muxRule[rule.Key](rule)
}

func Test_rule(t *testing.T)  {


//实现规则一
	rule1 := &Rule{
		Key:"rule1",
		TimeStart:"2010-01-01 OO:00:00",
		TimeEnd:"2020-01-01 OO:00:00",

	}
	opRule1 := func(rule *Rule) error {
		if rule.TimeStart > time.Now().Format("2006-01-02 15:04:05") || rule.TimeEnd < time.Now().Format("2006-01-02 15:04:05") {
			return errors.New("time is invalid")
		}
		return nil
	}

//实现规则二
	rule2 := &Rule{
		Key:"rule2",
		OrderAmount:100,
	}
//设传入参数用户购买金额为10
	amount := 10
	opRule2 := func(rule *Rule) error {
		if rule.OrderAmount != amount  {
			return errors.New("orderAmount is invalid")
		}
		return nil
	}
	registerBuy("rule1",opRule1)
	registerBuy("rule2",opRule2)
	ret1 := factoryBuy(rule1)
	ret2 := factoryBuy(rule2)
	if ret2 != nil || ret1 != nil {
		fmt.Printf("ret %v\n",ret1)
		fmt.Printf("ret %v\n",ret2)
	}else {
		fmt.Println("OK!")
	}

}



输出结果:
orderAmount is invalid



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值