标签:beego val err 数据库 func error interface 优化 代码
1、背景描述
用beego的ORM框架对sqllite进行库操作。项目中配置表存放在sqlite数据中,这样就存对每个表需要进行增删改查的操作。若按照beego提供方式对每一张表去实现增删改查的操作,这样会有很多的重复代码。例如,插入记录代码中,每个插入操作中都有相似的一段代码。为了代码更加的简洁,需要对重复代码进行封装。
2、实现方式
2.1、公共实现部分
利用golang的语言特性,面向接口编程,对公共操作提取接口:
type Repo interface {
SubscribeUpdateChange(func()) error
SubscribeDeleteChange(func()) error
Update(obj interface{}) (err error)
Delete(obj interface{}) (err error)
}
实现接口的结构:
type BaseRepo struct {
funcsUpdate []func()
funcsDelete []func()
}
//parameter is slice ([]StructName) or ptr(&aObj)
func (r BaseRepo) Update(obj interface{}) (err error) {
defer func() { r.UpdateChanged(err) }()
o := orm.NewOrm()
ms := TransToSlice(obj)//利用反射把入参处理成切片,需要自己实现
for _, m := range ms {
val := reflect.ValueOf(m)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
id := val.FieldByName("Id").Int()
if id == 0 {
_, err = o.Insert(m)
} else {
_, err = o.Update(m)
}
if err != nil {
return err
}
}
return nil
}
2.2、应用部分
各个配置表依据自己的需求进行接口定义[golang中组合来复用子结构的方法]:
type XxxxRepo interface {
repo.Repo
GetRecord(userName, host string) (xxxx, error)
}
type xxxxRepo struct {
repo.BaseRepo
}
func NewXxxxRepo() XxxxRepo {
return &xxxxRepo{}
}
func (this *xxxxRepo)(userName, host string) (xxxx,error){
//..........
return xxx,nil
}
3、总结
- 公共代码的提取,减少重复代码【clean code】
- golang面向接口编程,罗列接口代码更加清晰
- repo层的思考
标签:beego,val,err,数据库,func,error,interface,优化,代码 来源: https://www.cnblogs.com/meiguhuaxian/p/12781633.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。