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

目录
相关文章
|
12月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
9月前
|
Go
Go语言之匿名字段与组合 -《Go语言实战指南》
Go 语言通过匿名字段(embedding)实现类似继承的组合机制。匿名字段是在结构体中嵌套类型而不显式命名字段名,自动获取嵌入类型的字段和方法访问权限。支持方法提升、指针嵌入、字段冲突处理及多重组合,强调“组合优于继承”的设计理念,助力灵活高效的代码组织方式。
|
9月前
|
JSON Go C语言
Go语言之定义结构体(Struct)-《Go语言实战指南》
Go 语言中的结构体(`struct`)是一种复合数据类型,可将多个不同类型的字段组合成一个类型。本文介绍了结构体的基本定义、实例创建方式、字段访问与修改、零值特性、比较规则、嵌套使用及标签功能。通过示例代码详细讲解了如何定义和操作结构体,以及其在 JSON 编码等场景的应用。
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
381 71
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
288 1
Go nil 空结构体 空接口有什么区别?
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
173 3
Go to Learn Go之结构体
Go to Learn Go之结构体
138 5
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
存储 设计模式 安全
空结构体:Go 语言中的轻量级占位符
【8月更文挑战第31天】
341 0

热门文章

最新文章