Golang 高效排序数据详情

目录
  • 1.介绍
  • 2.切片排序
  • 3.自定义集合排序
  • 4总结

1.介绍

Golang 语言项目开发中,经常会遇到数据排序问题。Golang 语言标准库 sort 包,为我们提供了数据排序的功能,我们可以直接使用 sort.Sort() 函数进行数据排序,sort.Sort() 函数底层实现是以快排为主,并根据目标数据的具体情况选择不同的排序算法。本文我们介绍 sort 包排序数据的使用方法。

2.切片排序

Golang 语言标准库 sort 包中,sort.Sort() 函数用于数据排序,该函数需要一个 interface 类型的入参 sort.Interface,它包含三个方法,分别是 Len()Less() Swap() 。也就是说,如果我们需要使用 sort 包的 Sort 函数进行数据排序,首先入参的数据需要实现这三个方法,或者理解为任意元素类型的切片实现了这三个方法,都可以使用 sort.Sort() 函数排序数据。

sort 包代码:

type Interface interface {
 Len() int // 集合中元素的数量
 Less(i, j int) bool // 描述元素的顺序
 Swap(i, j int) // 交换索引为 i 和 j 的元素
} 

func Sort(data Interface)

需要注意的是 sort.Sort() 函数不能保证数据排序是稳定的,如果需要保证数据排序稳定,可以使用 sort.Stable() 函数,“稳定”的含义是原始数据中 a 和 b 的值相等,排序前 a 排在 b 的前面,排序后 a 仍排在 b 的前面。

为了方便读者朋友们理解,我们使用 int 类型的切片作为示例,介绍 sort.Sort() 函数的使用方法,我们定义一个类型 type IntSlice []int,并且给类型 IntSlice 实现 sort.Interface 接口类型定义的三个方法,然后使用 sort.Sort() 函数排序数据。

示例代码:

package main 

import (
 "fmt"
 "sort"
) 

type IntSlice []int 

func (s IntSlice) Len() int {
 return len(s)
} 

func (s IntSlice) Less(i, j int) bool {
 return s[i] > s[j]
} 

func (s IntSlice) Swap(i, j int) {
 s[i], s[j] = s[j], s[i]
} 

func main () {
 intSlice := IntSlice([]int{1, 3, 5, 7, 9})
 fmt.Println(intSlice) // 排序前
 sort.Sort(intSlice)
 fmt.Println(intSlice) // 排序后
}

输出结构:

[9 7 5 3 1]
 
[1 3 5 7 9]

读到这里,我相信聪明的读者朋友们已经了解了 sort.Sort() 的使用方式,同时也会产生一个疑问,难道每次使用 sort.Sort() 排序数据,都需要这么麻烦吗?我还不如自己写个遍历排序数据。

是的,当然不用这么麻烦,sort 包已经帮我们封装好了常用函数,我们直接使用就可以了。所以,上面的示例代码可以使用 sort.Ints() 函数排序数据。

示例代码:

func main () {
 intSlice := IntSlice([]int{9, 7, 5, 3, 1})
 fmt.Println(intSlice) // 排序前
 sort.Ints(intSlice)
 fmt.Println(intSlice) // 使用 sort.Ints() 排序数据
}

除了 sort.Ints() ,还有 sort.Float64s()sort.Strings()等。

3.自定义集合排序

Golang 语言项目开发中,我们经常会使用结构体,如果我们需要排序结构体类型的切片,应该怎么操作呢?

我们可以按照 Part 01 介绍的方式,实现那三个方法,然后调用 sort.Sort() 函数,当然,sort 包也为我们封装了排序结构体类型切片的函数 sort.Slice() ,但是,参数除了需要排序的数据之外,还需要提供一个 Less() 函数类型的参数。

示例代码:

people := []struct {
  Name string
  Age  int
 }{
  {"Gopher", 7},
  {"Alice", 55},
  {"Vera", 24},
  {"Bob", 75},
 }
 sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name })
 fmt.Println("By name:", people) 

 sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })
 fmt.Println("By age:", people)

输出结果:

By name: [{Alice 55} {Bob 75} {Gopher 7} {Vera 24}]
 
By age: [{Gopher 7} {Vera 24} {Alice 55} {Bob 75}]

4总结

本文我们介绍了怎么使用 Golang 语言标准库 sort 包排序数据,需要注意的是,除了本文使用的类型之外,其它任意类型只要实现 sort.Interface 的三个方法,都可以调用 sort.Sort() 函数排序数据。

到此这篇关于Golang 高效排序数据详情的文章就介绍到这了,更多相关Golang 高效排序数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang 利用反射对结构体优雅排序的操作方法

    最近开始实习,工作技术栈主要Python和Golang,目前的任务把Python模块重构为GO模块,然后出现了一个问题,就是要将一个结构体按结构体中各个字段进行排序,然后写入Redis,对于Pyhon来说for循环就能解决,但是对于Go语言来说,每一次排序都要写一个比较函数,写出来的代码太丑,非常长,代码结构是一致,只是比较字段不一样而已,个人无法接受啊,网上搜索也没搜索到合适解决方法,所以自己想了一个解决方法来优雅排序. 比较函数: func reflectCmp(i, j interface

  • golang 实现对Map进行键值自定义排序

    看代码吧~ //自定义结构体,用来自定义排序 type RecentlyUpdateListMapSorter []map[string]interface{} //根据MapSorter.Keys进行倒序排序 func (ms *RecentlyUpdateListMapSorter) SortReverse() { sort.Sort(sort.Reverse(ms)) } //自定义排序方法(Len(),Less(),Swap()) func (ms *RecentlyUpdateList

  • GOLANG版的冒泡排序和快速排序分享

    //冒泡排序 func mpSort(array []int) { for i:=0;i<len(array);i++ { for j:=0;j<len(array)-i-1;j++ { if array[j] > array[j+1] { array[j], array[j+1] = array[j+1], array[j] } } } } //快速排序 func quickSort(array []int, left int, right int) { if left < ri

  • Golang 高效排序数据详情

    目录 1.介绍 2.切片排序 3.自定义集合排序 4总结 1.介绍 在 Golang 语言项目开发中,经常会遇到数据排序问题.Golang 语言标准库 sort 包,为我们提供了数据排序的功能,我们可以直接使用 sort.Sort() 函数进行数据排序,sort.Sort() 函数底层实现是以快排为主,并根据目标数据的具体情况选择不同的排序算法.本文我们介绍 sort 包排序数据的使用方法. 2.切片排序 在 Golang 语言标准库 sort 包中,sort.Sort() 函数用于数据排序,该

  • Golang通脉之map详情

    目录 1.定义 2.基本使用 3.判断键是否存在 4.map的遍历 5.delete()函数删除map元素 6.指定顺序遍历map 7.map类型的切片 8.value为切片类型的map 9.map是引用类型 Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map 是一种无序的键值对的集合.map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 map 是一种集合,所以可以像迭代数组和切片那样迭代它.不过,map 是无序的,无法决定它的返回

  • Golang通脉之数据类型详情

    目录 1.标识符与关键字 1.1 标识符 1.2 关键字 2.变量 2.1 什么是变量 2.2 变量类型 2.3 变量声明 3.常量 3.1 iota 4.基本数据类型 4.1 整型 4.2 浮点型 4.3 复数 4.4 布尔值 4.5 字符串 4.6 byte和rune类型 4.7 类型转换 5.运算符 5.1 算数运算符 5.2 关系运算符 5.3 逻辑运算符 5.4 位运算符 5.5 赋值运算符 5.6 运算符优先级 1.标识符与关键字 在了解数据类型之前,先了解一下go的标识符和关键字

  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据的思路详解

    用过 Java 的同学都熟悉 Stream API,那么在 Go 里我们可以用类似的方式处理集合数据吗?本文给大家介绍 go-zero 内置的 Stream API,为了帮助理解,函数主要分为三类:获取操作.中间处理操作.终结操作. 什么是流处理 如果有 java 使用经验的同学一定会对 java8 的 Stream 赞不绝口,极大的提高了们对于集合类型数据的处理能力. int sum = widgets.stream() .filter(w -> w.getColor() == RED) .m

  • Golang文件读写操作详情

    目录 一.概念 二.读取文件操作 2.1 打开和关闭文件 defer 语句 2.2 file.Read() 读取文件 Read 方法定义 ReadAt方法定义 一次性读取 循环读取 2.3 bufio 读取文件 2.4 ioutil 读取文件 效率比较 三.写入文件操作 3.1 os.OpenFile()函数 3.2 Write和WriteString 方式写入 3.3 bufio.NewWriter 3.4 ioutil.WriteFile 四.复制文件 4.1 通过ioutil进行复制 4.

  • 利用Golang解析json数据的方法示例

    本文主要给大家介绍的是关于Golang解析json数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 使用 Golang 解析 json 数据,这种 json 格式是对象的数组,官方文档有一个示例: var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll

  • php实现按照权重随机排序数据的方法

    本文实例讲述了php实现按照权重随机排序数据的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: <?php   /**   * @param array $weight 权重  例如array('a'=>10,'b'=>20,'c'=>50)   * @return string key   键名    */  function roll($weight = array()) {    $roll = rand ( 1, array_sum ( $weight

  • 基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    gonews是基于 go+vue 实现的golang每日新闻浏览与检索平台 项目地址: Github 线上Demo:GoNews 数据来源: GoCN每日新闻 项目截图 部署 获取新闻数据 git clone https://github.com/gocn/news /data/news 获取源码 go get -u github.com/mikemintang/gonews 解析数据 nohup gonews -d /data/news > /data/log/gonews.log 2>&a

  • VSCode Golang dlv调试数据截断问题及处理方法

    使用VSCode对Golang程序进行调试时会遇到数据截断问题,string只显示前64个字符,array只显示前64个数据.经查dlv是支持以参数方式来控制的. 发现VSCode的Golang插件里面有个叫做go.delveConfig的配置,是可以设置dlv参数的.分享一下我的整个Golang配置: "go.buildOnSave": "off", "go.formatTool": "goimports", "g

  • 高效的数据同步工具DataX的使用及实现示例

    目录 前言 一.DataX 简介 1.DataX3.0 框架设计 2.DataX3.0 核心架构 二.使用 DataX 实现数据同步 1.Linux 上安装 DataX 软件 2.DataX 基本使用 3.安装 MySQL 数据库 4.通过 DataX 实 MySQL 数据同步 5.使用 DataX 进行增量同步 前言 我们公司有个项目的数据量高达五千万,但是因为报表那块数据不太准确,业务库和报表库又是跨库操作,所以并不能使用 SQL 来进行同步.当时的打算是通过 mysqldump 或者存储的

随机推荐