全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现数组排序和搜索_使用sort包和自定义函数

Go语言中排序与搜索通过sort包实现,主要操作切片;提供Ints、Strings等升序函数及Reverse降序,支持Slice自定义排序和Search二分查找(要求已排序)。

Go语言中数组(或切片)的排序与搜索主要通过标准库 sort 包完成。注意:Go 的数组是值类型且长度固定,实际开发中更常用的是切片(slice),而 sort 包所有函数都作用于切片。下面以切片为操作对象,介绍常用排序与搜索方法。

基础排序:升序与降序

sort 包提供了针对常见类型的快捷排序函数,如 sort.Intssort.Float64ssort.Strings,它们直接对切片原地升序排序。

  • 对整数切片升序:sort.Ints([]int{3, 1, 4, 1, 5}) → [1 1 3 4 5]
  • 对字符串切片升序:
    sort.Strings([]string{"zebra", "apple", "banana"}) → ["apple", "banana", "zebra"]
  • 降序需配合 sort.Reverse:例如 sort.Sort(sort.Reverse(sort.IntSlice(nums)))

自定义类型排序:实现 sort.Interface

若要排序结构体或自定义类型,需让该类型实现 sort.Interface 接口,即三个方法:Len()Less(i, j int) boolSwap(i, j int)

更简便的方式是嵌入 sort.Slice(Go 1.8+)——它接受切片和一个比较函数:

  • sort.Slice(people, func(i, j int) bool { return people[i].Age
  • sort.Slice(people, func(i, j int) bool { return people[i].Name > people[j].Name }) // 降序按姓名

二分搜索:仅适用于已排序切片

sort 包提供的搜索函数(如 sort.SearchIntssort.SearchStringssort.Search)均要求数据已升序排列,否则结果未定义。

  • 查找整数:i := sort.SearchInts([]int{1, 3, 5, 7, 9}, 5),返回首个 ≥ 目标值的索引(此处为 2)
  • 通用搜索:sort.Search(len(data), func(i int) bool { return data[i] >= target })
  • 注意:它不返回“是否找到”,而是插入位置;需手动判断 i 才算存在

注意事项与常见误区

排序和搜索在 Go 中是零拷贝、原地操作,但切片本身是引用类型,传参时仍需注意底层数组共享问题。

  • 排序修改原切片,如需保留原始顺序,请先复制:sorted := append([]int(nil), original...); sort.Ints(sorted)
  • sort.Search 的比较函数必须满足“前假后真”单调性,即存在一个边界 i,使得 f(0)...f(i-1) 为 false,f(i)...f(n-1) 为 true
  • 数组(如 [5]int)不能直接传给 sort 函数;需转为切片:sort.Ints(arr[:])


# go  # golang  # go语言  # app  # apple  # 排列  # 标准库  # less  # String  # sort  # 字符串  # 结构体  # bool  # int  # 接口  # 值类型  # 引用类型  # Interface 


相关文章: 如何选择高性价比服务器搭建个人网站?  javascript中对象的定义、使用以及对象和原型链操作小结  SQL查询语句优化的实用方法总结  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站主机类型有哪些?如何正确选型  linux top下的 minerd 木马清除方法  如何基于云服务器快速搭建个人网站?  建站主机解析:虚拟主机配置与服务器选择指南  建站之星如何快速更换网站模板?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  网站制作员失业,怎样查看自己网站的注册者?  如何通过西部建站助手安装IIS服务器?  制作农业网站的软件,比较好的农业网站推荐一下?  建站org新手必看:2024最新搭建流程与模板选择技巧  高防服务器租用如何选择配置与防御等级?  如何在宝塔面板中创建新站点?  如何快速查询网址的建站时间与历史轨迹?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何在香港服务器上快速搭建免备案网站?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何用腾讯建站主机快速创建免费网站?  建站VPS选购需注意哪些关键参数?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  javascript中的try catch异常捕获机制用法分析  如何通过cPanel快速搭建网站?  个人网站制作流程图片大全,个人网站如何注销?  如何在阿里云购买域名并搭建网站?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  如何快速搭建虚拟主机网站?新手必看指南  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站主机是否属于云主机类型?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  ,巨量百应是干嘛的?  简单实现Android文件上传  如何挑选优质建站一级代理提升网站排名?  北京专业网站制作设计师招聘,北京白云观官方网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  建站之星Pro快速搭建教程:模板选择与功能配置指南  XML的“混合内容”是什么 怎么用DTD或XSD定义  建站之星如何配置系统实现高效建站?  如何生成腾讯云建站专用兑换码?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  公司门户网站制作流程,华为官网怎么做?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。

  • 返回顶部
  • 400-708-3566
  • QQ在线
  • 微信二维码