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顺序
	})