想请教一下问题,我想对beego的orm再封装一层,方便使用,可参数类型限制编译不过,不知道怎么改了。
```
举例说明,现有两个数据模型:
// 模型1:
type Post struct {
Id int
Title string
Content string
Status int
}
// 获取数据集
var posts []Post
orm.NewOrm().QueryTable("post").Filter("Status", 1).All(&posts)
// 模型2:
type News struct {
Id int
Title string
Content string
Status int
}
// 获取数据集合
var news []News
orm.NewOrm().QueryTable("post").Filter("Status", 1).All(&news)
```
想着对orm进行再次封装,以便方便调用, 比如抽象出一个方法:
```
func GetDataList(tableName string, dataList interface{}) (datalist interface{}) {
orm.NewOrm().QueryTable(tableName).Filter("Status", 1).All(&datalist)
return datalist
}
```
意想中的调用方式是这样:
```
var posts []Post
fmt.Println(GetDataList("post", post))
var news []News
fmt.Println(GetDataList("news", news))
```
可事实发现编译不过~报错信息:
```
wrong object type `*interface {}` for rows scan, need *backend-api/models.post
```
想问一下在go中这样一般怎么写?
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, ".", "__", -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)
```
#4
更多评论
楼主对 interface知之甚少, 如果已经作为interface使用了 是不能再&传它的指针的.
你啥时候见过传interface{}类型的指针的这种用法啊?
#1