对结构体指定字段进行排序:
对结构体指定字段进行排序:
packagemainimport ( "fmt""sort") // 对结构体指定字段进行排序typeUserstruct { Namestring`json:"name"`// `json:"xxx"`:在结构体和json字符串字段顺序不一致的情况下:unmarshal根据tag去寻找对应字段的内容Ageint`json:"age"`} // type Users []User// func SortByAge(u Users) {funcSortByAge(u []User) { fmt.Printf("源数据:%+v\n", u) sort.Slice(u, func(i, jint) bool { // descreturnu[i].Age>u[j].Age }) fmt.Printf("按Age降序:%+v\n", u) sort.Slice(u, func(i, jint) bool { // ascreturnu[i].Age<u[j].Age }) fmt.Printf("按Age升序:%+v\n", u) } funcmain() { // 初始化结构体对象数组:// 初始化方法1:// users := Users{// {// Name: "test1",// Age: 22,// },// {// Name: "test2",// Age: 19,// },// {// Name: "test3",// Age: 25,// },// }// 初始化方法2:varusers []UservaruUseru.Name="test1"u.Age=22users=append(users, u) u.Name="test2"u.Age=20users=append(users, u) u.Name="test3"u.Age=26users=append(users, u) SortByAge(users) } // 输出:源数据:[{Name:test1Age:22} {Name:test2Age:20} {Name:test3Age:26}] 按Age降序:[{Name:test3Age:26} {Name:test1Age:22} {Name:test2Age:20}] 按Age升序:[{Name:test2Age:20} {Name:test1Age:22} {Name:test3Age:26}]
此外也可使用sort.Sort()方法,不过需要自己去实现 Len()、Swap()、Less()方法,参考:golang对自定义类型排序
另外,通过借助“结构体指定字段进行排序”解了一道LeetCode 347题:传送门
补充示例:同时对多个字段进行排序(升序/降序)
packagemainimport ( "fmt""sort") typeUserstruct { NamestringHighintWightint} // 先根据身高 High 排序,在High相等时,再根据体重 Wight 排序,最后返回排序后结果funcTestSort(userArr []User) []User { fori, val :=rangeuserArr { userArr[i] =User{Name: val.Name, High: val.High, Wight: val.Wight} } sort.Slice(userArr, func(i, jint) bool { // 根据High降序returnuserArr[i].High>userArr[j].High }) sort.Slice(userArr, func(i, jint) bool { ifuserArr[i].High==userArr[j].High { // 当High相等时returnuserArr[i].Wight>userArr[j].Wight// 根据Wight降序 } else { returnuserArr[i].High>userArr[j].High } }) returnuserArr} funcmain() { userInfoArr :=TestSort([]User{ { Name: "user1", High: 170, Wight: 60, }, { Name: "user2", High: 170, Wight: 80, }, { Name: "user1", High: 185, Wight: 60, }, }) fmt.Println("userInfoArr: ", userInfoArr) }