初级会员
  • 第 42410 位会员
  • zflinux21
  • 2019-09-04 11:00:02
  • Offline
  • 20 78

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 3楼 @focusonline 因为我想把获取列表这个操作封装成一个公共的,要不然每次都得重写很多重复的代码。 真实的获取列表的方法长个这样: ``` func (m *BaseModel) GetDataList(tableName string, l []interface{}, query map[string]string, fields []string, sortBy map[string]string, page int, pageSize int) (dataList []interface{}, pager Pager, err error) { o := orm.NewOrm() qs := o.QueryTable(tableName) for k, v := range query { k = strings.Replace(k, ".", "__", -1) qs = qs.Filter(k, v) } totalCount, _ := qs.Count() pager.TotalCount = int(totalCount) pager.CurrentPage = page pager.TotalPage = int(math.Ceil(float64(pager.TotalCount / pageSize))) pager.NextPage = page + 1 var sortFields []string for k, v := range sortBy { orderby := "" v = strings.ToLower(v) if v == "desc" { orderby = "-" + k }else if v == "asc" { orderby = k }else { return nil, pager, errors.New("Error: Invalid order. Must be either [asc|desc]") } sortFields = append(sortFields, orderby) } qs = qs.OrderBy(sortFields...).RelatedSel() pageLimit := (page - 1) * pageSize if _, err = qs.Limit(pageSize, pageLimit).All(&l, fields...); err != nil { return nil, pager, err } if len(fields) == 0 { for _, v := range l { dataList = append(dataList, v) } } else { for _, v := range l { c := make(map[string]interface{}) val := reflect.ValueOf(v) for _, fname := range fields { c[fname] = val.FieldByName(fname).Interface() } dataList = append(dataList, c) } } return dataList, pager, nil } ``` 调用则是: ``` query := map[string]string{"status":"1"} fields := []string{} sortBy := map[string]string{"id":"desc"} datalist, pager, _ := models.GetAdminDataList(query, fields, sortBy, 1, 20) ``` 如参数类型那边语言层面实现不了,那只能把上面这个方法拆分成2个方法,一个返回QuerySeter(GetDataListQuerySeter),一个获取处理完数据(GetDataList)。 ``` var news []News o := GetDataListQuerySeter() o.All(&news) dataList := o.GetDataList(&news) ```
  • #1 @focusonline 恩恩,刚学习GO了解的不多,我想问一下想要实现封装,正确的方法应该是怎么写的呢?