我是靠谱客的博主 秀丽小蝴蝶,最近开发中收集的这篇文章主要介绍golang 代码扩展,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 
 
在写业务逻辑的时候如何写可扩展的代码?
之后加功能怎么不影响原来的代码?

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

//用户需要符合某些规则才能购买产品
//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 %vn",ret1)
		fmt.Printf("ret %vn",ret2)
	}else {
		fmt.Println("OK!")
	}

}



输出结果:
orderAmount is invalid



                

最后

以上就是秀丽小蝴蝶为你收集整理的golang 代码扩展的全部内容,希望文章能够帮你解决golang 代码扩展所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部