go 数组排序有sort方法,下面是相当于继承sort,结构体重写当中部分方法来实现排序
type Menu struct {
Id uint `json:"id"`
Name string `json:"name"`
IconType int `json:"icon_type"`
Icon string `json:"icon"`
UrlType int `json:"url_type"`
Url string `json:"url"`
Sort int `json:"sort"`
Public int `json:"public"`
Addtime int `json:"addtime"`
}
// GetByIds 根据IDS获取菜单列表
func (menu *Menu) GetByIds(ids []uint) (menus []Menu, err error) {
if len(ids) == 0 {
return
}
err = common.DB.Order("sort desc").Find(&menus, ids).Error
return
}
// GetPublics 获取公共菜单列表
func (menu *Menu) GetPublics() (menus []Menu, err error) {
if err := common.DB.Where("public = 1").Order("sort desc").Find(&menus).Error; err != nil {
log.Printf("获取公共菜单列表错误:%v", err)
}
return
}
func (menu *Menu) Add() (id uint, err error) {
result := common.DB.Create(menu)
id = menu.Id
if result.Error != nil {
err = result.Error
}
return // 返回新建数据的id 和 错误信息,在控制器里接收
}
func (menu *Menu) TableName() string {
return "menu"
}
// MenuWrapper menu列表排序实现
type MenuWrapper struct {
Menus []Menu
By func(p, q *Menu) bool
}
type SortBy func(p, q *Menu) bool
func (pw MenuWrapper) Len() int { // 重写 Len() 方法
return len(pw.Menus)
}
func (pw MenuWrapper) Swap(i, j int) { // 重写 Swap() 方法
pw.Menus[i], pw.Menus[j] = pw.Menus[j], pw.Menus[i]
}
func (pw MenuWrapper) Less(i, j int) bool { // 重写 Less() 方法
return pw.By(&pw.Menus[i], &pw.Menus[j])
}
// SortMenu 封装成 SortMenu 方法
func SortMenu(menus []Menu, by SortBy) {
sort.Sort(MenuWrapper{menus, by})
}
使用方法
menu := new(dal.Menu)
//获取public的菜单
public, _ := menu.GetPublics()
dal.SortMenu(arr, func(p, q *dal.Menu) bool {
return p.Sort > q.Sort //按sort倒序
//return p.Name < q.Name //按name顺序
})