前言

有时候我们需要根据切片中的某个字段进行切片排序,但sort包中只有默认基本类型 intfloat64string 的排序,所以我们可以手动实现sort包的 sort.Interface 接口,来完成自定义排序。这个接口有三个方法 Len()Less(i,j)Swap(i,j)

切片排序

package main

import (
"fmt"
"sort"
) type Person struct {
Name string // 姓名
Age int // 年龄
CreatedAt int64 // 记录时间
} // 按照 Person.Age 从大到小排序
type PersonSlice []Person // 重写 Len() 方法
func (p PersonSlice) Len() int {
return len(p)
} // 重写 Swap() 方法
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
} // 重写 Less() 方法
// 使用不同字段进行对比,并依此排序,这里用了Age,可以更换成CreatedAt进行排序的
// 使用 < 从大到小排序,使用 > 从小到大排序
func (p PersonSlice) Less(i, j int) bool {
return p[j].Age < p[i].Age
} func main() {
people1 := Person{
Name: "牛奔1",
Age: 18,
CreatedAt: 1618667000,
}
people2 := Person{
Name: "牛奔2",
Age: 19,
CreatedAt: 1618667100,
}
people3 := Person{
Name: "牛奔3",
Age: 20,
CreatedAt: 1618667200,
} peopleSlice := PersonSlice{}
peopleSlice = append(peopleSlice, people2, people1, people3) fmt.Println(peopleSlice) sort.Sort(PersonSlice(peopleSlice)) // 按照Age的逆序排序
fmt.Println(peopleSlice) sort.Sort(sort.Reverse(PersonSlice(peopleSlice))) // 按照Age的升序排序
fmt.Println(peopleSlice)
}

输出:

[{牛奔2 19 1618667100} {牛奔1 18 1618667000} {牛奔3 20 1618667200}]
[{牛奔3 20 1618667200} {牛奔2 19 1618667100} {牛奔1 18 1618667000}]
[{牛奔1 18 1618667000} {牛奔2 19 1618667100} {牛奔3 20 1618667200}]

看到结果已经根据年龄字段排序啦

go切片排序的更多相关文章

  1. go:内置函数 | 闭包 | 数组 | 切片 | 排序 | map | 锁

    内置函数 1.close: 主要是用来关闭channel 2.len:用来求长度,比如string.array.slice.map.channel 3.new与make都是用来分配内存 new用来分配 ...

  2. go语言笔记——切片函数常见操作,增删改查和搜索、排序

    7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如  ...

  3. GO语言练习---对切片进行排序

    对整型切片进行选择排序 package main import "fmt" /*对切片排序*/ func SortSlice(slice []int) { for i := 0; ...

  4. python3.7[列表] 索引切片

    python3.7[列表] 索引  切片 排序     #### 列表.sort 永久排序   sorted(列表) 临时排序   ### >>> print(sorted(a))[ ...

  5. 大数据开发-Go-数组,切片

    new()和make的区别 二者看起来没什么区别,但是他们的行为不同,分别适用于不同的类型 new (T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 * T 的内存地址:这种方法 ...

  6. 再见,Python!你好,Go语言

    Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike.Ken Thompson 和 Robert Griesemer 写成.由于出身名门,Go 在诞生之初就吸引了大批开发者的关注.诞生 ...

  7. GO map

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 语法:map[KeyType]ValueType KeyType:表示键的类型. V ...

  8. Go语言map

    map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典.这是一种快速寻找值的理想结构:给定 k ...

  9. go语言程序设计学习笔记-1

    https://www.jb51.net/article/126998.htm go标准库文档https://studygolang.com/pkgdoc 1. 如果想要再本地直接查看go官方文档,可 ...

  10. Go 字典(Map)

    比较熟悉 Python 的对于字典肯定不会陌生,在 Go 中 map 就是 Python 中字典的概念,它的基本格式是 map[keyType]valueType .map 的读取和设置和 slice ...

随机推荐

  1. [转]IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    原文链接: IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

  2. Appium_ios自动化问题汇总

    1.使用Xcode遇到的问题 xcode-select: error: tool 'instruments' requires Xcode, but active developer director ...

  3. Solution -「LOCAL」菜

    \(\mathscr{Description}\)   Private link.   给定 \(N,L,X,Y,K\),求选出 \(0\le a_1\le a_2\le\cdots a_{N-1}\ ...

  4. c# 设置WebBrowser的UserAgent

    void SuppressScriptErrors(WebBrowser webBrowser, bool hide) { webBrowser.Navigating += (s, e) => ...

  5. 开源的分布式事务解决方案-Seata

    Seata 是什么? (1)Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务. (2)在 Seata 开源之前,Seata 对应的内部版本在阿里经济 ...

  6. 第四五章 (Nginx+Lua)Lua模块开发

    在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每 ...

  7. docker网络配置:bridge模式、host模式、container模式、none模式

    在docker平台里有四种网络模式,今天继续分享一下它们的常用知识,进一步加深对docker技术的理解. 1.docker网络模式分类 docker run创建Docker容器时,可以用--net选项 ...

  8. Java版的对象关系映射实现

    在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个Java版的对象关系映射程序. 思路如下: 1: 对象必须是一个Java Bean. 2: 遍历对象的所有以 ...

  9. docker搭建rabbitmq镜像集群

    Rabbitmq普通集群模式,是将交换机.绑定.队列的元数据复制到集群里的任何一个节点,但队列内容只存在于特定的节点中,客户端通过连接集群中任意一个节点,即可以生产和消费集群中的任何队列内容(因为每个 ...

  10. Linux 文件压缩和解压缩命令

    Linux 文件压缩和解压缩命令 在Linux操作系统中,文件压缩和解压缩是日常管理和维护任务中的重要一环.通过压缩文件,可以显著减少存储空间的使用,并加快网络传输速度.Linux提供了多种压缩和解压 ...