go切片排序
前言
有时候我们需要根据切片中的某个字段进行切片排序,但sort包中只有默认基本类型 int 、 float64 和 string 的排序,所以我们可以手动实现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切片排序的更多相关文章
- go:内置函数 | 闭包 | 数组 | 切片 | 排序 | map | 锁
内置函数 1.close: 主要是用来关闭channel 2.len:用来求长度,比如string.array.slice.map.channel 3.new与make都是用来分配内存 new用来分配 ...
- go语言笔记——切片函数常见操作,增删改查和搜索、排序
7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 ...
- GO语言练习---对切片进行排序
对整型切片进行选择排序 package main import "fmt" /*对切片排序*/ func SortSlice(slice []int) { for i := 0; ...
- python3.7[列表] 索引切片
python3.7[列表] 索引 切片 排序 #### 列表.sort 永久排序 sorted(列表) 临时排序 ### >>> print(sorted(a))[ ...
- 大数据开发-Go-数组,切片
new()和make的区别 二者看起来没什么区别,但是他们的行为不同,分别适用于不同的类型 new (T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 * T 的内存地址:这种方法 ...
- 再见,Python!你好,Go语言
Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike.Ken Thompson 和 Robert Griesemer 写成.由于出身名门,Go 在诞生之初就吸引了大批开发者的关注.诞生 ...
- GO map
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 语法:map[KeyType]ValueType KeyType:表示键的类型. V ...
- Go语言map
map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典.这是一种快速寻找值的理想结构:给定 k ...
- go语言程序设计学习笔记-1
https://www.jb51.net/article/126998.htm go标准库文档https://studygolang.com/pkgdoc 1. 如果想要再本地直接查看go官方文档,可 ...
- Go 字典(Map)
比较熟悉 Python 的对于字典肯定不会陌生,在 Go 中 map 就是 Python 中字典的概念,它的基本格式是 map[keyType]valueType .map 的读取和设置和 slice ...
随机推荐
- Qt编写可视化大屏电子看板系统31-模块9视频监控
一.前言 视频监控模块采用ffmpeg作为解码内核,可以在系统设置中填入一个视频地址,同时支持本地视频文件.USB摄像机.远程onvif摄像机(海康大华等).网络视频地址,大屏系统中默认有一个视频监控 ...
- MySQL版本是8.0.3,数据库连接字符串都检查无误,驱动类名加不加cj都试过了,URL是否加时区、是否加useSSL都试过了,都无法正常登录进去!
我在运行library这个web程序登录时(我的MySQL版本是8.0.3,数据库连接字符串都检查无误,驱动类名加不加cj都试过了,URL是否加时区.是否加useSSL都试过了,都无法正常登录进去!) ...
- Raspberry pi 上部署调试.Net的IoT程序
树莓派(Raspberry pi)是一款基于ARM 架构的单板计算机(Single Board Computer),可以运行各种 Linux 操作系统,其官方推荐使用的 Raspberry Pi OS ...
- 基于AT89C51的数字时钟课程设计
摘要:单片微型计算机简称单片机,又称为微控制器,是将CPU.RAM.ROM.定时/计数器.I/O接口电路集成到一块电路芯片上构成的微型计算机.本次设计的系统由单片机系统.数码管显示系统.键盘.蜂鸣器等 ...
- C++之OpenCV入门到提高007:调整图像亮度和对比度
一.介绍 今天是这个系列<C++之 Opencv 入门到提高>的第七篇文章.这篇文章也不难,介绍如何调整图像的亮度.图像本质上也是数据,既然是数据,我们就可以针对图像的每个像素进行增加或者 ...
- 记录vue和element-ui导出表格到excell
1.安装插件 npm install 'file-saver' npm install 'xlsx' 2.引入插件 import FileSaver from 'file-saver' import ...
- (七).NET6.0部署RabbitMQ
1.下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 2.Rabbitmq官网下载地址: https://www.rabbitmq.com/d ...
- Solution -「LOJ #6895」Yet Another NPC Problem
\(\mathscr{Description}\) Link. 给定 \(l,m\),求当 \(k=m,m+1,\dots,m+l-1\) 时,所有 \(k\) 阶有标号简单无向图中,最大团大 ...
- 连接Redis 错误的解决方法: It was not possible to connect to the redis server(s); to create a disconnected multiplexer
The error you are getting is usually a sign that you have not set abortConnect=false in your connect ...
- Readys pg walkthrough Intermediate
nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.175.166 Starting Nmap 7.94SVN ( https://nmap.org ) a ...