Go函数封装参数类型限制编译不过

zflinux21 · · 696 次点击
3楼 <a href="/user/focusonline" title="@focusonline">@focusonline</a> 因为我想把获取列表这个操作封装成一个公共的,要不然每次都得重写很多重复的代码。 真实的获取列表的方法长个这样: ``` 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, &#34;.&#34;, &#34;__&#34;, -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 := &#34;&#34; v = strings.ToLower(v) if v == &#34;desc&#34; { orderby = &#34;-&#34; + k }else if v == &#34;asc&#34; { orderby = k }else { return nil, pager, errors.New(&#34;Error: Invalid order. Must be either [asc|desc]&#34;) } sortFields = append(sortFields, orderby) } qs = qs.OrderBy(sortFields...).RelatedSel() pageLimit := (page - 1) * pageSize if _, err = qs.Limit(pageSize, pageLimit).All(&amp;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{&#34;status&#34;:&#34;1&#34;} fields := []string{} sortBy := map[string]string{&#34;id&#34;:&#34;desc&#34;} datalist, pager, _ := models.GetAdminDataList(query, fields, sortBy, 1, 20) ``` 如参数类型那边语言层面实现不了,那只能把上面这个方法拆分成2个方法,一个返回QuerySeter(GetDataListQuerySeter),一个获取处理完数据(GetDataList)。 ``` var news []News o := GetDataListQuerySeter() o.All(&amp;news) dataList := o.GetDataList(&amp;news) ```
#4
更多评论
楼主对 interface知之甚少, 如果已经作为interface使用了 是不能再&amp;传它的指针的. 你啥时候见过传interface{}类型的指针的这种用法啊?
#1
恩恩,刚学习GO了解的不多,我想问一下想要实现封装,正确的方法应该是怎么写的呢?
#2