我們實現(xiàn)分層代碼的時候習慣使用一個小寫的結(jié)構(gòu)體去實現(xiàn)當前層次對外的接口,外層調(diào)用本層方法只能去調(diào)用實例化方法獲得一個接口對象。簡單如下:
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
}
// 獲取優(yōu)惠券列表
func (c *couponDao) GetCouponList(param *do.CouponParam, data *[]app.V6UserCouponLog,
userId int, res *do.CouponList) error {
return c.getCouponList(param, data, userId, res)
}
不用關注細節(jié),這里實際上就是有一個對外的結(jié)構(gòu)體,外部調(diào)用NewCouponDaoer方法 獲取到一個接口:couponDaoer , 實際上從代碼規(guī)范上來說我們必須認定couponDao 結(jié)構(gòu)體必須實現(xiàn)該接口,這是必須的。我們?nèi)绻@里是一個基本庫的話,那么我們處理過程中別人修改你的方法,不小心把改繼承的方法改掉了,之前調(diào)用就會報錯。
這里正確方法應該是強制couponDao 實現(xiàn)Daoer方法
var _ CouponDaoEr = (*couponDao)(nil)
var _ CouponDaoEr = new(couponDao)
- 第一種寫法是:運行時檢測
- 第二種new寫法:編譯時檢測
這個寫法可以對我們基礎庫的擴展有非常大的幫助,所以特別說明一下。