Golang 语言的排序、结构体排序

golang对结构体排序(struct),重写sort package main import ( "fmt" "sort" ) type Log struct { UserID int Message string Num float64 CreateTime string } type Wrapper struct { log []Log by func(p, q *Log) bool } type SortBy func(p, q *Log) bool 阅读详情

1.前言

开发过程中,我们经常需要对元素进行排序,使用 Go 我们可以轻松实现。

Go 内置 sort 包中提供了根据一些排序函数可对任何序列进行排序,并提供自定义排序规则的能力。

sort 包实现了四种基本排序算法:插入排序(Shell 排序)、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于 sort 包内部使用,sort 包会根据实际数据自动选择高效的排序算法。

Go sort 包主要提供了三种排序能力:
(1)基本类型切片排序;
(2)自定义比较器;
(3)排序任意数据结构。

三者易用程度逐渐降低。

2.基本类型切片排序

为了便于对常用数据类型的操作,sort 包提供了对 []int切片、[]float64切片 和 []string 切片的排序支持。

func Ints(x []int)
func Float64s(x []float64)
func Strings(x []string)

示例:

package main

import (
	"fmt"
	"sort"
)

func main() {
	// []int 排序
	slInt := []int{5, 2, 6, 3, 1, 4} // unsorted
	sort.Ints(slInt)
	fmt.Println(slInt) // 输出 [1 2 3 4 5 6]
	
	// []float64 排序
	slF64 := []float64{5.2, -1.3, 0.7, -3.8, 2.6} // unsorted
	sort.Float64s(slF64)
	fmt.Println(slF64)	// 输出 [-3.8 -1.3 0.7 2.6 5.2]
	
	// []string 字典序
	slStr := []string{"Go", "Bravo", "Gopher", "Alpha", "Grin", "Delta"}
	sort.Strings(slStr)
	fmt.Println(slStr) // 输出 [Alpha Bravo Delta Go Gopher Grin]
}

3.自定义比较器

使用 sort.Slice() 函数可以排序任意类型的切片,但是需要用户提供函数来判断元素大小关系,函数类型为func(i, j int) bool,其中参数 i, j 是序列中的索引。

func Slice(x interface{}, less func(i, j int) bool)

这个用来比较大小的函数就是比较器,返回值 true 表示下标 i 的元素小于下表 j 的元素。如果是降序排列的话,可以理解为返回 true 表示下标 i 的元素排在下标 j 的元素前面。

如果想稳定排序的话,使用 sort.SliceStable(),在排序切片时会保留相等元素的原始顺序。

按照年龄升序排序的示例

func main() {
	slStdnt := []struct {
		Name   string
		Age    int
		Height int
	}{
		{"Alice", 23, 175},
		{"David", 18, 185},
		{"Eve", 18, 165},
		{"Bob", 25, 170},
	}

	// 用 age 排序,年龄相等的元素保持原始顺序
	sort.SliceStable(slStdnt, func(i, j int) bool {
		return slStdnt[i].Age < slStdnt[j].Age
	})
	fmt.Println(slStdnt)
}

运行输出:

[{David 18 185} {Eve 18 165} {Alice 23 175} {Bob 25 170}]

如果想要在年龄相等的情况下再按照身高排序,我们修改一下比较器即可。

// 优先按照年龄排,年龄相等的话再按照身高排
sort.SliceStable(slStdnt, func(i, j int) bool {
	if slStdnt[i].Age < slStdnt[j].Age {
		return true
	} 
	if slStdnt[i].Age > slStdnt[j].Age {
		return false
	}
	return slStdnt[i].Height < slStdnt[j].Height
})

运行输出:

[{Eve 18 165} {David 18 185} {Alice 23 175} {Bob 25 170}]

4.排序任意数据结构

使用 sort.Sort() 或者 sort.Stable() 函数可完成对任意类型元素的排序。

一个内置的排序算法需要知道三个东西:序列的长度,表示两个元素比较的结果,一种交换两个元素的方式;这就是 sort.Interface 的三个方法:

type Interface interface {
    Len() int
    Less(i, j int) bool // i, j 是元素的索引
    Swap(i, j int)
}

这种方法相较于前面介绍的两种排序,用起来稍微麻烦了点,因为需要用户自定义的东西更多了,不过带来的好处也是显而易见的,更加普适。

还是以学生排序为例,在自定义的结构体上实现 srot.Interface 接口。

type Student struct {
	Name   string
	Age    int
	Height int
}

// ByAgeHeight 实现 sort.Interface 接口
type ByAgeHeight []Student

func (a ByAgeHeight) Len() int { return len(a) }

// Less 先用年龄排序,年龄相等再用身高排
func (a ByAgeHeight) Less(i, j int) bool {
	if a[i].Age < a[j].Age {
		return true
	}
	if a[i].Age > a[j].Age {
		return false
	}
	return a[i].Height < a[j].Height
}
func (a ByAgeHeight) Swap(i, j int) { a[i], a[j] = a[j], a[i] }

func main() {
	slStdnt := []Student{
		{"Alice", 23, 175},
		{"David", 18, 185},
		{"Eve", 18, 165},
		{"Bob", 25, 170},
	}
	sort.Stable(ByAgeHeight(slStdnt))
	fmt.Println(slStdnt)
}

运行输出:

[{Eve 18 165} {David 18 185} {Alice 23 175} {Bob 25 170}]

5.小结

Go sort 包提供的排序能力丰富易用,掌握上面三种排序的用法,便可轻松应对大部分排序场景。

sort 包除了提供以上三种排序能力,还为我们提供了其他功能,比如判断序列是否有序、在有序序列中通过二分查找指定元素下标,反转有序序列获得逆序等,具体用法参见官方文档 Package sort。

慕课软件质量保证与测试(习题集) 慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试 阅读详情

相关推荐

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站)同时连接。

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 8861

go语言的排序和搜索(转载)

http://studygolang.com/articles/1598 go语言的排序和搜索 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题。排序 sort 是个基本的操作,当然搜索 search 也是。c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便; c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模...

aoan3957的博客 370

曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理)

本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。

weixin_29200741的博客 412

Golang结构体排序

Golang对结构体字段排序的案例 本案例通过 sort 方法,对产品的 price 字段进行排序,仅供参考... package main import ( "fmt" "sort" ) type Product struct { Name string Price float64 Date string } type DataSlice struct { Data []Product By func(q, p *Product) bool } // 重写 Len() 方法

qq_40929027的博客 794

ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站

本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。

m0_71627844的博客 2125

微信小程序利用Echarts加载中国地图的步骤

微信小程序如何利用Echarts加载地图?可按照如下四个步骤进行。(阅读时间大概3分钟)。

成都都成 5273

golang 根据某个特定字段对结构体的顺序进行排序

golang 根据某个特定字段对结构体的顺序进行排序

J_Lee 1576

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6753

go语言结构体排序

简言 1. go语言的基本数据类型可以直接调用sort()函数进行排序 2. 结构体的排序需要实现三个函数(获取长度函数,交换函数,比较函数)即可 实验如下图 源代码如下 package main import ( "fmt" "sort" ) // 学生信息 type Student struct { Age int Score int } // 结构体数组 type Students []*Student // 下面的三个函数必须实现(获取长度函数,交换函数,比较函数..

papaya的博客 2539

基于Python实现人脸识别相似度对比

随着人工智能技术的不断进步,人脸识别成为了一种广泛应用的技术。人脸相似度对比是其中的一个重要应用场景,可以用于人脸搜索、身份验证等方面。本文将介绍如何使用Python实现人脸相似度对比。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 9808

基于Linux的PCIe设备驱动开发入门到精通-- 11.2 锁机制与并发控制 (自旋锁、互斥锁) 11.3 性能瓶颈分析与优化建议

本文探讨Linux驱动开发中的性能优化方法论,重点聚焦并发控制与性能瓶颈分析。从锁机制选择(自旋锁、互斥锁等)到工具使用(ftrace、perf),详细介绍了定位锁竞争和CPU热点的实战步骤,包括ftrace事件跟踪和perf火焰图分析。针对常见性能瓶颈(CPU/内存/I/O/锁竞争),提出了锁粒度优化、无锁结构替换、中断处理优化等解决方案。强调性能优化需要理论结合实践,通过"假设-测量-验证"的循环持续迭代。为开发者提供了一套从问题定位到解决的完整方法论,助力开发高性能工业级驱动。

MHD0815的博客 126

Sort对结构体的排序(代码+注释)

Sort对结构体的排序(代码+注释) package main import ( “fmt” “sort” ) /* 对结构按其中一个字段排序 */ type person struct { Name string info string Age int } type personSlice []person func (s personSlice) Len() int { return len(s) } func (s personSlice) Swap(i, j int) { s[i], s

weixin_45714531的博客 350

YOLOv11改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 1496

golang struct数组排序_golang 结构体 slice 排序-Go语言中文社区

go语言的slice()不仅仅可以对int类型的数组进行排序,还可以对struct类型的数组进行排序排序函数如下1.Slice() 不稳定排序2. SliceStable() 稳定排序3.SliceIsSorted() 判断是否已排序结构体定义如下,我们完全可以定义更复杂的结构体:// 结构体定义type test struct {value intstr string}结果如下图:完整代...

weixin_39670545的博客 630

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

golang struct数组排序_GO语言为结构体排序

package mainimport ("fmt""io/ioutil""sort""time")type info struct {Name stringTime time.Time}type newlist []*infofunc main() {l, e := getFilelist("./")if e != nil {fmt.Println(e)}sort.Sort(newlist(l))...

weixin_39757893的博客 351

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

go语言的排序、结构体排序

go语言的排序、结构体排序

cherish的技术博 381

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Golang语言社区--结构体数据排序

原文地址:http://www.golang.ltd/forum.php?mod=viewthread&tid=2816&extra=page%3D1 作者:彬哥 结构体,数据排序 package main import (         "fmt"         "sort"         "strconv" )

QQ1528884535的专栏 1581

go语言结构体对象按照时间对象排序

获取用户列表,按照申请时间倒序排序,注:调用标准库的sort.Sort必须要先实现Len(),Less(),Swap() 三个方法. ...... import ( "fmt" "io/ioutil" "sort" "time" ) type User struct { ApplicantGuid string `json:"applicant_guid...

xiaoluyouyue的博客 2095

GO语言为结构体排序

package main import ( "fmt" "io/ioutil" "sort" "time" ) type info struct { Name string Time time.Time } type newlist []*info func main() { l, e := getFilelist("./") if e != nil { fmt....

weixin_33841503的博客 151

go语言----对结构体进行排序

package main import "fmt" type myStruct struct { Sid int //用户sid NN string Score int64 //分数 } func SortUserScore(fc []myStruct) []myStruct{ for i:=0;i&lt;len(fc)-1;i++{ for j:= i+1 ...

zhukangle的博客 969

【go语言系列学习】01.接口-实例:对结构体切片按照自定义要求排序

对结构体切片按照自定义要求排序

weixin_42072280的博客 885

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

对结构体指定字段进行排序: package main import ( "fmt" "sort" ) // 对结构体指定字段进行排序 type User struct { Name string `json:"name"` // `json:"xxx"`:在结构体和json字符串字段顺序不一致的情况下:unmarshal根据tag去寻找对应字段的内容 Age int `json:"age"` } // type Users []User // func SortByAge(.

梦~' 3644

Go 结构体各种排序

1.根据结构体里的map里的属性进行排序 2.根据不同属性进行多重排序 package main import ( "github.com/pantsing/log" "sort" ) type Animal struct { allPerson []*Person count int32 } type Person struct { name string age int ...

代码改变世界,keep coding。 3362

go语言内置的sort包(对结构体排序)

`Slice(x any, less func(i, j int) bool)`: 对任意切片`x`使用比较函数`less`进行排序。- `Search(n int, f func(int) bool) int`: 使用二分查找找到第一个满足`f(i)`为`true`的索引。- `SearchInts(a []int, x int) int`: 在排序的`[]int`中查找`x`的索引。- `Less(i, j int) bool`: 报告索引`i`的元素是否应排序在索引`j`的元素之前。

m0_63322803的博客 957
上一篇: golang 多协程处理任务
下一篇: golang 结构体作为map的元素时,不能够直接赋值给结构体的某个字段
Webben
博客等级 码龄10年 19粉丝 98原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值