我们实现分层代码的时候习惯使用一个小写的结构体去实现当前层次对外的接口,外层调用本层方法只能去调用实例化方法获得一个接口对象。简单如下:
type CouponDaoEr interface {
GetCouponList(param *do.CouponParam, data *[]app.V6UserCouponLog,
userId int, res *do.CouponList) error
}
func NewCouponDaoEr(dbApp *xorm.Engine) CouponDaoEr {
return &couponDao{
dbApp: dbApp,
}
}
type couponDao struct {
dbApp *xorm.Engine
}
// 获取优惠券列表
func (c *couponDao) GetCouponList(param *do.CouponParam, data *[]app.V6UserCouponLog,
userId int, res *do.CouponList) error {
return c.getCouponList(param, data, userId, res)
}
不用关注细节,这里实际上就是有一个对外的结构体,外部调用NewCouponDaoer方法 获取到一个接口:couponDaoer , 实际上从代码规范上来说我们必须认定couponDao 结构体必须实现该接口,这是必须的。我们如果这里是一个基本库的话,那么我们处理过程中别人修改你的方法,不小心把改继承的方法改掉了,之前调用就会报错。
这里正确方法应该是强制couponDao 实现Daoer方法
var _ CouponDaoEr = (*couponDao)(nil)
var _ CouponDaoEr = new(couponDao)
- 第一种写法是:运行时检测
- 第二种new写法:编译时检测
这个写法可以对我们基础库的扩展有非常大的帮助,所以特别说明一下。