Go 通过结构体指定字段进行排序

简介: Go 通过结构体指定字段进行排序

 

对结构体指定字段进行排序:

image.gif

 对结构体指定字段进行排序:

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}]

image.gif

此外也可使用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)
}

image.gif

目录
相关文章
|
5月前
|
XML JSON Go
掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)
掌握Go语言:Go语言结构体进阶,探索高级特性与实用技巧(23)
|
5月前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
5月前
|
关系型数据库 MySQL Go
工厂模式+自动注册管理Go多包结构体
工厂模式+自动注册管理Go多包结构体
147 1
|
28天前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
35 5
|
1月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
1月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
5月前
|
Go
Go语言的匿名字段
Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段,称之为匿名字段或者嵌套字段。
191 37
Go语言的匿名字段
|
2月前
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
35 0
|
2月前
|
存储 Java Go
Go从入门到放弃之结构体(面向对象)
Go从入门到放弃之结构体(面向对象)
|
2月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧